You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by mu...@apache.org on 2006/01/13 23:02:12 UTC

svn commit: r368871 [6/6] - in /xml/security/branches/jsr105_0_16/src/org: apache/xml/security/ apache/xml/security/algorithms/ apache/xml/security/algorithms/implementations/ apache/xml/security/c14n/ apache/xml/security/c14n/helper/ apache/xml/securi...

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMReference.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMReference.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMReference.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMReference.java Fri Jan 13 14:00:23 2006
@@ -46,9 +46,11 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
+import org.jcp.xml.dsig.internal.DigesterOutputStream;
 import org.apache.xml.security.exceptions.Base64DecodingException;
 import org.apache.xml.security.signature.XMLSignatureInput;
 import org.apache.xml.security.utils.Base64;
+import org.apache.xml.security.utils.UnsyncBufferedOutputStream;
 
 /**
  * DOM-based implementation of Reference.
@@ -59,7 +61,7 @@
 public final class DOMReference extends DOMStructure 
     implements Reference, DOMURIReference {
 
-    static Logger log = Logger.getLogger(DOMReference.class.getName());
+    private static Logger log = Logger.getLogger("org.jcp.xml.dsig.internal.dom");
 
     private final DigestMethod digestMethod;
     private final String id;
@@ -78,6 +80,7 @@
     private boolean validationStatus;
     private Data derefData;
     private InputStream dis;
+    private MessageDigest md;
 
     /**
      * Creates a <code>Reference</code> from the specified parameters.
@@ -114,7 +117,7 @@
             this.appliedTransforms = Collections.EMPTY_LIST;
         } else {
             List transformsCopy = new ArrayList(appliedTransforms);
-            for (int i = 0; i < transformsCopy.size(); i++) {
+            for (int i = 0, size = transformsCopy.size(); i < size; i++) {
                 if (!(transformsCopy.get(i) instanceof Transform)) {
                     throw new ClassCastException
                         ("appliedTransforms["+i+"] is not a valid type");
@@ -127,7 +130,7 @@
             this.transforms = Collections.EMPTY_LIST;
         } else {
             List transformsCopy = new ArrayList(transforms);
-            for (int i = 0; i < transformsCopy.size(); i++) {
+            for (int i = 0, size = transformsCopy.size(); i < size; i++) {
                 if (!(transformsCopy.get(i) instanceof Transform)) {
                     throw new ClassCastException
                         ("transforms["+i+"] is not a valid type");
@@ -165,7 +168,7 @@
 	throws MarshalException {
         // unmarshal Transforms, if specified
         Element nextSibling = DOMUtils.getFirstChildElement(refElem);
-        List transforms = new ArrayList();
+        List transforms = new ArrayList(5);
         if (nextSibling.getLocalName().equals("Transforms")) {
 	    Element transformElem = DOMUtils.getFirstChildElement(nextSibling);
 	    while (transformElem != null) {
@@ -236,7 +239,9 @@
 
     public void marshal(Node parent, String dsPrefix, DOMCryptoContext context)
 	throws MarshalException {
-        log.log(Level.FINE, "Marshalling Reference");
+	if (log.isLoggable(Level.FINE)) {
+            log.log(Level.FINE, "Marshalling Reference");
+	}
         Document ownerDoc = DOMUtils.getOwnerDocument(parent);
 
         refElem = DOMUtils.createElement
@@ -252,14 +257,13 @@
             Element transformsElem = DOMUtils.createElement
 		(ownerDoc, "Transforms", XMLSignature.XMLNS, dsPrefix);
 	    refElem.appendChild(transformsElem);
-	    Iterator i = appliedTransforms.iterator();
-	    while (i.hasNext()) {
-	        DOMStructure transform = (DOMStructure) i.next();
+	    for (int i = 0, size = appliedTransforms.size(); i < size; i++) {
+	        DOMStructure transform = 
+		    (DOMStructure) appliedTransforms.get(i);
 	        transform.marshal(transformsElem, dsPrefix, context);
 	    }
-	    i = transforms.iterator();
-	    while (i.hasNext()) {
-	        DOMStructure transform = (DOMStructure) i.next();
+	    for (int i = 0, size = transforms.size(); i < size; i++) {
+	        DOMStructure transform = (DOMStructure) transforms.get(i);
 	        transform.marshal(transformsElem, dsPrefix, context);
 	    }
 	}
@@ -268,7 +272,9 @@
 	((DOMDigestMethod) digestMethod).marshal(refElem, dsPrefix, context);
 
 	// create and append DigestValue element
-	log.log(Level.FINE, "Adding digestValueElem");
+	if (log.isLoggable(Level.FINE)) {
+	    log.log(Level.FINE, "Adding digestValueElem");
+	}
         Element digestValueElem = DOMUtils.createElement
             (ownerDoc, "DigestValue", XMLSignature.XMLNS, dsPrefix);
 	if (digestValue != null) {
@@ -289,12 +295,13 @@
 	} else {
 	    data = appliedTransformData;
 	}
-	byte[] digestInput = transform(data, signContext);
-        digestValue = digestInput;
+	digestValue = transform(data, signContext);
 
 	// insert digestValue into DigestValue element
 	String encodedDV = Base64.encode(digestValue);
-	log.log(Level.FINE, "Reference object uri = " + uri);
+	if (log.isLoggable(Level.FINE)) {
+	    log.log(Level.FINE, "Reference object uri = " + uri);
+	}
         Element digestElem = DOMUtils.getLastChildElement(refElem);
 	if (digestElem == null) {
 	    throw new XMLSignatureException("DigestValue element expected");
@@ -303,14 +310,10 @@
 	digestElem.appendChild
 	    (refElem.getOwnerDocument().createTextNode(encodedDV));
 
-        Boolean cache = (Boolean)
-	    signContext.getProperty("javax.xml.dsig.cacheReference");
-        if (cache != null && cache.booleanValue() == true) {
-	    this.dis = new ByteArrayInputStream(digestInput);
-	    this.derefData = data;
-	}
 	digested = true;
-	log.log(Level.FINE, "Reference digesting completed");
+	if (log.isLoggable(Level.FINE)) {
+	    log.log(Level.FINE, "Reference digesting completed");
+	}
     }
 
     public boolean validate(XMLValidateContext validateContext)
@@ -322,19 +325,16 @@
 	    return validationStatus;
 	}
 	Data data = dereference(validateContext);
-	byte[] digestInput = transform(data, validateContext);
+	calcDigestValue = transform(data, validateContext);
 
-	calcDigestValue = digestInput;
-	log.log(Level.FINE, "Expected digest: " + Base64.encode(digestValue));
-	log.log(Level.FINE, "Actual digest: " + Base64.encode(calcDigestValue));
+	if (log.isLoggable(Level.FINE)) {
+	    log.log(Level.FINE, "Expected digest: " 
+		+ Base64.encode(digestValue));
+	    log.log(Level.FINE, "Actual digest: " 
+		+ Base64.encode(calcDigestValue));
+	}
 
 	validationStatus = Arrays.equals(digestValue, calcDigestValue);
-        Boolean cache = (Boolean)
-	    validateContext.getProperty("javax.xml.dsig.cacheReference");
-        if (cache != null && cache.booleanValue() == true) {
-	    this.dis = new ByteArrayInputStream(digestInput);
-	    this.derefData = data;
-	}
 	validated = true;
 	return validationStatus;
     }
@@ -358,6 +358,12 @@
 	}
 	try {
             data = deref.dereference(this, context);
+	    if (log.isLoggable(Level.FINE)) {
+                log.log(Level.FINE, "URIDereferencer class name: "
+                    + deref.getClass().getName());
+                log.log(Level.FINE, "Data class name: "
+                    + data.getClass().getName());
+            }
         } catch (URIReferenceException ure) {
 	    throw new XMLSignatureException(ure);
         }
@@ -368,24 +374,32 @@
     private byte[] transform(Data dereferencedData, 
 	XMLCryptoContext context) throws XMLSignatureException {
 
-	Data data = dereferencedData;
-
-	OutputStream os = new BufferedOutputStream(new ByteArrayOutputStream());
-	MessageDigest md;
-	try {
-	    md = MessageDigest.getInstance("SHA-1");
-	} catch (NoSuchAlgorithmException nsae) {
-	    throw new XMLSignatureException(nsae);
-	}
-	DigestOutputStream dos = new DigestOutputStream(os, md);
-	Iterator i = transforms.iterator();
-	while (i.hasNext()) {
-	    DOMTransform transform = (DOMTransform) i.next();
+	if (md == null) {
 	    try {
-                if (i.hasNext()) {
+	        md = MessageDigest.getInstance("SHA-1");
+	    } catch (NoSuchAlgorithmException nsae) {
+	        throw new XMLSignatureException(nsae);
+	    }
+	}
+	md.reset();
+	DigesterOutputStream dos;
+	Boolean cache = (Boolean)
+            context.getProperty("javax.xml.crypto.dsig.cacheReference");
+        if (cache != null && cache.booleanValue() == true) {
+            this.derefData = copyDerefData(dereferencedData);
+            dos = new DigesterOutputStream(md, true);
+        } else {
+            dos = new DigesterOutputStream(md);
+        }
+	OutputStream os = new UnsyncBufferedOutputStream(dos);
+        Data data = dereferencedData;
+        for (int i = 0, size = transforms.size(); i < size; i++) {
+	    DOMTransform transform = (DOMTransform) transforms.get(i);
+	    try {
+                if (i < size - 1) {
                     data = transform.transform(data, context);
                 } else {
-                    data = transform.transform(data, context, dos);
+                    data = transform.transform(data, context, os);
                 }
 	    } catch (TransformException te) {
 		throw new XMLSignatureException(te);
@@ -409,10 +423,13 @@
 	        } else {
 	            throw new XMLSignatureException("unrecognized Data type");
 	        }
-	        xi.updateOutputStream(dos);
+	        xi.updateOutputStream(os);
 	    }
-	    dos.close();
-	    return md.digest();
+	    os.flush();
+	    if (cache != null && cache.booleanValue() == true) {
+                this.dis = dos.getInputStream();
+            }
+            return dos.getDigestValue();
 	} catch (Exception e) {
 	    throw new XMLSignatureException(e);
 	}
@@ -447,5 +464,40 @@
 
     boolean isDigested() {
 	return digested;
+    }
+
+    private static Data copyDerefData(Data dereferencedData) {
+        if (dereferencedData instanceof ApacheData) {
+            // need to make a copy of the Data
+            ApacheData ad = (ApacheData) dereferencedData;
+            XMLSignatureInput xsi = ad.getXMLSignatureInput();
+            if (xsi.isNodeSet()) {
+                try {
+                    final Set s = xsi.getNodeSet();
+                    return new NodeSetData() {
+                        public Iterator iterator() { return s.iterator(); }
+                    };
+                } catch (Exception e) {
+                    // log a warning
+                            log.log(Level.WARNING,
+                        "cannot cache dereferenced data: " + e);
+                    return null;
+                }
+            } else if (xsi.isElement()) {
+                return new DOMSubTreeData
+                    (xsi.getSubNode(), xsi.isExcludeComments());
+            } else if (xsi.isOctetStream() || xsi.isByteArray()) {
+                try {
+                return new OctetStreamData
+                  (xsi.getOctetStream(), xsi.getSourceURI(), xsi.getMIMEType());
+                } catch (IOException ioe) {
+                    // log a warning
+                            log.log(Level.WARNING,
+                        "cannot cache dereferenced data: " + ioe);
+                    return null;
+                }
+            }
+        }
+        return dereferencedData;
     }
 }

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java Fri Jan 13 14:00:23 2006
@@ -85,7 +85,7 @@
             this.transforms = Collections.EMPTY_LIST;
         } else {
             List transformsCopy = new ArrayList(transforms);
-            for (int i = 0; i < transformsCopy.size(); i++) {
+            for (int i = 0, size = transformsCopy.size(); i < size; i++) {
                 if (!(transformsCopy.get(i) instanceof Transform)) {
                     throw new ClassCastException
                         ("transforms["+i+"] is not a valid type");
@@ -165,9 +165,8 @@
 	    Element transformsElem = DOMUtils.createElement
                 (ownerDoc, "Transforms", XMLSignature.XMLNS, dsPrefix);
 	    rmElem.appendChild(transformsElem);
-	    Iterator i = transforms.iterator();
-	    while (i.hasNext()) {
-	        ((DOMTransform) i.next()).marshal
+	    for (int i = 0, size = transforms.size(); i < size; i++) {
+	        ((DOMTransform) transforms.get(i)).marshal
 		    (transformsElem, dsPrefix, context);
             }
 	}
@@ -201,10 +200,9 @@
 	Data data = deref.dereference(this, context);
 
         // pass dereferenced data through Transforms
-        Iterator i = transforms.iterator();
 	try {
-            while (i.hasNext()) {
-                Transform transform = (Transform) i.next();
+	    for (int i = 0, size = transforms.size(); i < size; i++) {
+                Transform transform = (Transform) transforms.get(i);
                 data = ((DOMTransform) transform).transform(data, context);
             }
 	} catch (Exception e) {

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSHA1DigestMethod.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSHA1DigestMethod.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSHA1DigestMethod.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSHA1DigestMethod.java Fri Jan 13 14:00:23 2006
@@ -45,8 +45,7 @@
  */
 public final class DOMSHA1DigestMethod extends DOMDigestMethod {
 
-    static Logger log = Logger.getLogger(DOMSHA1DigestMethod.class.getName());
-
+    private static Logger log = Logger.getLogger("org.jcp.xml.dsig.internal.dom");
     private MessageDigest md;
 
     /**
@@ -97,18 +96,20 @@
 	    throw new DigestException("SHA1 MessageDigest not available");
         }
         DigestInputStream dis = new DigestInputStream(is, md);
-        log.log(Level.FINE, "Predigested reference:\n");
-        byte[] buf = new byte[1024];
-	int bytesRead = 0;
-        while (true) {
-	    int read = dis.read(buf);
-	    if (read == -1) { // EOF
-	        break;
+	if (log.isLoggable(Level.FINE)) {
+            log.log(Level.FINE, "Predigested reference:\n");
+            byte[] buf = new byte[1024];
+	    int bytesRead = 0;
+            while (true) {
+	        int read = dis.read(buf);
+	        if (read == -1) { // EOF
+	            break;
+	        }
+	        bytesRead = bytesRead + read;
+	        log.log(Level.FINE, new String(buf));
 	    }
-	    bytesRead = bytesRead + read;
-	    log.log(Level.FINE, new String(buf));
+	    log.log(Level.FINE, "bytesRead=" + bytesRead);
 	}
-	log.log(Level.FINE, "bytesRead="+bytesRead);
 	return md.digest();
     }
 }

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignatureMethod.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignatureMethod.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignatureMethod.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignatureMethod.java Fri Jan 13 14:00:23 2006
@@ -158,32 +158,39 @@
      * underlying signature or MAC algorithm.
      *
      * @param key the verification key
+     * @param si the DOMSignedInfo
      * @param signature the signature bytes to be verified
+     * @param context the XMLValidateContext
      * @return <code>true</code> if the signature verified successfully,
      *    <code>false</code> if not
-     * @throws NullPointerException if <code>key</code> or
+     * @throws NullPointerException if <code>key</code>, <code>si</code> or
      *    <code>signature</code> are <code>null</code>
      * @throws InvalidKeyException if the key is improperly encoded, of
      *    the wrong type, or parameters are missing, etc
      * @throws SignatureException if an unexpected error occurs, such
      *    as the passed in signature is improperly encoded
+     * @throws XMLSignatureException if an unexpected error occurs
      */
-    public abstract boolean verify(Key key, byte[] data, byte[] signature)
-        throws InvalidKeyException, SignatureException;
+    public abstract boolean verify(Key key, DOMSignedInfo si, byte[] signature,
+	XMLValidateContext context) throws InvalidKeyException, SignatureException,
+	XMLSignatureException;
 
     /**
-     * Signs the specified bytes with the specified key, using the underlying
+     * Signs the bytes with the specified key, using the underlying
      * signature or MAC algorithm.
      *
      * @param key the signing key
-     * @param data the bytes to be signed
+     * @param si the DOMSignedInfo
+     * @param context the XMLSignContext
      * @return the signature
      * @throws NullPointerException if <code>key</code> or
-     *    <code>data</code> are <code>null</code>
+     *    <code>si</code> are <code>null</code>
      * @throws InvalidKeyException if the key is improperly encoded, of
      *    the wrong type, or parameters are missing, etc
+     * @throws XMLSignatureException if an unexpected error occurs
      */
-    public abstract byte[] sign(Key key, byte[] data) throws InvalidKeyException;
+    public abstract byte[] sign(Key key, DOMSignedInfo si, XMLSignContext context) 
+        throws InvalidKeyException, XMLSignatureException;
 
     /**
      * Marshals the algorithm-specific parameters to an Element and

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java Fri Jan 13 14:00:23 2006
@@ -63,7 +63,7 @@
 	    throw new IllegalArgumentException("properties cannot be empty");
         } else {
             List propsCopy = new ArrayList(properties);
-            for (int i = 0; i < propsCopy.size(); i++) {
+            for (int i = 0, size = propsCopy.size(); i < size; i++) {
                 if (!(propsCopy.get(i) instanceof SignatureProperty)) {
                     throw new ClassCastException
                         ("properties["+i+"] is not a valid type");
@@ -85,8 +85,9 @@
         id = DOMUtils.getAttributeValue(propsElem, "Id");
 
 	NodeList nodes = propsElem.getChildNodes();
-	List properties = new ArrayList(nodes.getLength());
-	for (int i = 0; i < nodes.getLength(); i++) {
+	int length = nodes.getLength();
+	List properties = new ArrayList(length);
+	for (int i = 0; i < length; i++) {
 	    Node child = nodes.item(i);
 	    if (child.getNodeType() == Node.ELEMENT_NODE) {
 	        properties.add(new DOMSignatureProperty((Element) child));
@@ -118,9 +119,9 @@
         DOMUtils.setAttributeID(propsElem, "Id", id);
 
         // create and append any properties
-	Iterator i = properties.iterator();
-	while (i.hasNext()) {
-	    DOMSignatureProperty property = (DOMSignatureProperty) i.next();
+	for (int i = 0, size = properties.size(); i < size; i++) {
+	    DOMSignatureProperty property = 
+		(DOMSignatureProperty) properties.get(i);
 	    property.marshal(propsElem, dsPrefix, context);
         }
 	    

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java Fri Jan 13 14:00:23 2006
@@ -67,7 +67,7 @@
 	    throw new IllegalArgumentException("content cannot be empty");
         } else {
             List contentCopy = new ArrayList(content);
-            for (int i = 0; i < contentCopy.size(); i++) {
+            for (int i = 0, size = contentCopy.size(); i < size; i++) {
                 if (!(contentCopy.get(i) instanceof XMLStructure)) {
                     throw new ClassCastException
                         ("content["+i+"] is not a valid type");
@@ -93,8 +93,9 @@
         id = DOMUtils.getAttributeValue(propElem, "Id");
 
 	NodeList nodes = propElem.getChildNodes();
-	List content = new ArrayList(nodes.getLength());
-	for (int i = 0; i < nodes.getLength(); i++) {
+	int length = nodes.getLength();
+	List content = new ArrayList(length);
+	for (int i = 0; i < length; i++) {
 	    content.add(new javax.xml.crypto.dom.DOMStructure(nodes.item(i)));
 	}
         if (content.isEmpty()) {
@@ -128,10 +129,9 @@
         DOMUtils.setAttribute(propElem, "Target", target);
 
         // create and append any elements and mixed content
-	Iterator i = content.iterator();
-	while (i.hasNext()) {
+	for (int i = 0, size = content.size(); i < size; i++) {
 	    javax.xml.crypto.dom.DOMStructure property = 
-		(javax.xml.crypto.dom.DOMStructure) i.next();
+		(javax.xml.crypto.dom.DOMStructure) content.get(i);
 	    DOMUtils.appendChild(propElem, property.getNode());
         }
 	    
@@ -156,10 +156,11 @@
     }
 
     private boolean equalsContent(List otherContent) {
-	if (content.size() != otherContent.size()) {
+	int osize = otherContent.size();
+	if (content.size() != osize) {
             return false;
 	}
-        for (int i = 0; i < otherContent.size(); i++) {
+        for (int i = 0; i < osize; i++) {
             XMLStructure oxs = (XMLStructure) otherContent.get(i);
             XMLStructure xs = (XMLStructure) content.get(i);
             if (oxs instanceof javax.xml.crypto.dom.DOMStructure) {

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java Fri Jan 13 14:00:23 2006
@@ -27,9 +27,11 @@
 import javax.xml.crypto.dsig.*;
 
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.io.OutputStream;
 import java.util.*;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -37,6 +39,8 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
+import org.apache.xml.security.utils.Base64;
+import org.apache.xml.security.utils.UnsyncBufferedOutputStream;
 import org.apache.xml.security.utils.XMLUtils;
 
 /**
@@ -46,8 +50,7 @@
  */
 public final class DOMSignedInfo extends DOMStructure implements SignedInfo {
 
-    static Logger log = Logger.getLogger(DOMSignedInfo.class.getName());
-
+    private static Logger log = Logger.getLogger("org.jcp.xml.dsig.internal.dom");
     private List references;
     private CanonicalizationMethod canonicalizationMethod;
     private SignatureMethod signatureMethod;
@@ -56,9 +59,6 @@
     private Element localSiElem;
     private InputStream canonData;
 
-    // a reference to the enclosing XMLSignature
-    private XMLSignature signature;	
-
     /**
      * Creates a <code>DOMSignedInfo</code> from the specified parameters. Use
      * this constructor when the <code>Id</code> is not specified.
@@ -86,9 +86,8 @@
 	    throw new IllegalArgumentException("list of references must " +
 	        "contain at least one entry");
 	}
-	Iterator i = this.references.iterator();
-	while (i.hasNext()) {
-	    Object obj = i.next();
+	for (int i = 0, size = this.references.size(); i < size; i++) {
+	    Object obj = this.references.get(i);
 	    if (!(obj instanceof Reference)) {
 		throw new ClassCastException("list of references contains " +
 		    "an illegal type");
@@ -122,10 +121,9 @@
      *
      * @param siElem a SignedInfo element
      */
-    public DOMSignedInfo(Element siElem, XMLSignature signature, 
-	XMLCryptoContext context) throws MarshalException {
+    public DOMSignedInfo(Element siElem, XMLCryptoContext context)
+	throws MarshalException {
 	localSiElem = siElem;
-	this.signature = signature;
 	ownerDoc = siElem.getOwnerDocument();
 
         // get Id attribute, if specified
@@ -140,7 +138,7 @@
 	signatureMethod = DOMSignatureMethod.unmarshal(smElem);
 
 	// unmarshal References
-	ArrayList refList = new ArrayList();
+	ArrayList refList = new ArrayList(5);
 	Element refElem = DOMUtils.getNextSiblingElement(smElem);
 	while (refElem != null) {
 	    refList.add(new DOMReference(refElem, context));
@@ -169,30 +167,31 @@
 	return canonData;
     }
 
-    public byte[] canonicalize(XMLCryptoContext context)
+    public void canonicalize(XMLCryptoContext context,ByteArrayOutputStream bos)
 	throws XMLSignatureException {
 
 	if (context == null) {
             throw new NullPointerException("context cannot be null");
 	}
 
-	XMLUtils.circumventBug2650(ownerDoc);
-	SubDocumentData sdd = new SubDocumentData(localSiElem, true, null);
+	OutputStream os = new UnsyncBufferedOutputStream(bos);
+        try {
+            os.close();
+        } catch (IOException e) {
+            // Impossible
+        }
+
+	DOMSubTreeData subTree = new DOMSubTreeData(localSiElem, true);
 
 	OctetStreamData data = null;
 	try {
 	    data = (OctetStreamData) ((DOMCanonicalizationMethod) 
-		canonicalizationMethod).canonicalize(sdd, context);
+		canonicalizationMethod).canonicalize(subTree, context, os);
 	} catch (TransformException te) {
 	    throw new XMLSignatureException(te);
 	}
 
-	byte[] signedInfoBytes;
-	try {
-            signedInfoBytes = Utils.readBytesFromStream(data.getOctetStream());
-	} catch (IOException ioe) {
-            throw new XMLSignatureException(ioe);
-	}
+	byte[] signedInfoBytes = bos.toByteArray();
 
         // this whole block should only be done if logging is enabled
 	if (log.isLoggable(Level.FINE)) {
@@ -204,20 +203,15 @@
             } catch (IOException ioex) {} //ignore since this is logging code
             log.log(Level.FINE, "Canonicalized SignedInfo:\n" 
 		+ new String(siBytes));
+	    log.log(Level.FINE, "Data to be signed/verified:"
+                + Base64.encode(signedInfoBytes));
 	}
 
 	this.canonData = new ByteArrayInputStream(signedInfoBytes);
-	return signedInfoBytes;
     }
 
     public void marshal(Node parent, String dsPrefix, DOMCryptoContext context)
 	throws MarshalException {
-	marshal(parent, dsPrefix, context, null);
-    }
-
-    public void marshal(Node parent, String dsPrefix, DOMCryptoContext context,
-	XMLSignature signature) throws MarshalException {
-	this.signature = signature;
         ownerDoc = DOMUtils.getOwnerDocument(parent);
 
 	Element siElem = DOMUtils.createElement
@@ -233,9 +227,8 @@
 	    (siElem, dsPrefix, context);
 
 	// create and append Reference elements
-	Iterator i = references.iterator();
-	while (i.hasNext()) {
-	    DOMReference reference = (DOMReference) i.next();
+	for (int i = 0, size = references.size(); i < size; i++) {
+	    DOMReference reference = (DOMReference) references.get(i);
 	    reference.marshal(siElem, dsPrefix, context);
 	}
 

Added: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSubTreeData.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSubTreeData.java?rev=368871&view=auto
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSubTreeData.java (added)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMSubTreeData.java Fri Jan 13 14:00:23 2006
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ */
+/*
+ * $Id$
+ */
+package org.jcp.xml.dsig.internal.dom;
+
+import javax.xml.crypto.NodeSetData;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.NoSuchElementException;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+/**
+ * This is a subtype of NodeSetData that represents a dereferenced
+ * same-document URI as the root of a subdocument. The main reason is
+ * for efficiency and performance, as some transforms can operate
+ * directly on the subdocument and there is no need to convert it
+ * first to an XPath node-set.
+ */
+public class DOMSubTreeData implements NodeSetData {
+
+    private boolean excludeComments;
+    private Iterator ni;
+    private Node root;
+
+    public DOMSubTreeData(Node root, boolean excludeComments) {
+	this.root = root;
+	this.ni = new DelayedNodeIterator(root, excludeComments);
+	this.excludeComments = excludeComments;
+    }
+
+    public Iterator iterator() {
+	return ni;
+    }
+
+    public Node getRoot() {
+	return root;
+    }
+
+    public boolean excludeComments() {
+	return excludeComments;
+    }
+
+    /**
+     * This is an Iterator that contains a backing node-set that is
+     * not populated until the caller first attempts to advance the iterator.
+     */
+    static class DelayedNodeIterator implements Iterator {
+    	private Node root;
+	private List nodeSet;
+	private ListIterator li;
+	private boolean withComments;
+
+	DelayedNodeIterator(Node root, boolean excludeComments) {
+            this.root = root;
+            this.withComments = !excludeComments;
+	}
+
+        public boolean hasNext() {
+            if (nodeSet == null) {
+		nodeSet = dereferenceSameDocumentURI(root);
+		li = nodeSet.listIterator();
+            }
+	    return li.hasNext();
+        }
+
+        public Object next() {
+            if (nodeSet == null) {
+		nodeSet = dereferenceSameDocumentURI(root);
+		li = nodeSet.listIterator();
+            }
+            if (li.hasNext()) {
+		return (Node) li.next();
+            } else {
+                throw new NoSuchElementException();
+	    }
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+
+	/**
+         * Dereferences a same-document URI fragment.
+	 *
+	 * @param node the node (document or element) referenced by the
+         *	 URI fragment. If null, returns an empty set.
+	 * @return a set of nodes (minus any comment nodes)
+	 */
+	private List dereferenceSameDocumentURI(Node node) {
+            List nodeSet = new ArrayList();
+            if (node != null) {
+		nodeSetMinusCommentNodes(node, nodeSet, null);
+            }
+            return nodeSet;
+	}
+
+	/**
+         * Recursively traverses the subtree, and returns an XPath-equivalent
+	 * node-set of all nodes traversed, excluding any comment nodes,
+	 * if specified.
+	 *
+         * @param node the node to traverse
+	 * @param nodeSet the set of nodes traversed so far
+	 * @param the previous sibling node
+	 */
+	private void nodeSetMinusCommentNodes(Node node, List nodeSet,
+            Node prevSibling) {
+            switch (node.getNodeType()) {
+		case Node.ELEMENT_NODE :
+                    NamedNodeMap attrs = node.getAttributes();
+                    if (attrs != null) {
+                        for (int i = 0, len = attrs.getLength(); i < len; i++) {
+                            nodeSet.add(attrs.item(i));
+                        }
+                    }
+                    nodeSet.add(node);
+		case Node.DOCUMENT_NODE :
+                    Node pSibling = null;
+                    for (Node child = node.getFirstChild(); child != null;
+                        child = child.getNextSibling()) {
+			nodeSetMinusCommentNodes(child, nodeSet, pSibling);
+                        pSibling = child;
+                    }
+                    break;
+		case Node.TEXT_NODE :
+		case Node.CDATA_SECTION_NODE:
+                    // emulate XPath which only returns the first node in
+                    // contiguous text/cdata nodes
+                    if (prevSibling != null &&
+                        (prevSibling.getNodeType() == Node.TEXT_NODE ||
+                         prevSibling.getNodeType() == Node.CDATA_SECTION_NODE)){			return;
+                    }
+		case Node.PROCESSING_INSTRUCTION_NODE :
+                    nodeSet.add(node);
+	            break;
+		case Node.COMMENT_NODE:
+		    if (withComments) { 
+                        nodeSet.add(node);
+		    }
+            }
+	}
+    }
+}

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java Fri Jan 13 14:00:23 2006
@@ -66,7 +66,7 @@
         DOMCryptoContext dcc = (DOMCryptoContext) context;
 
 	// Check if same-document URI and register ID
-	if (uri != null && uri.startsWith("#")) {
+	if (uri != null && uri.length() != 0 && uri.charAt(0) == '#') {
             String id = uri.substring(1);
 
 	    if (id.startsWith("xpointer(id(")) {
@@ -87,10 +87,10 @@
 	} 
 
         try {
+	    String baseURI = context.getBaseURI();
             ResourceResolver apacheResolver = 
-	        ResourceResolver.getInstance(uriAttr, context.getBaseURI());
-            XMLSignatureInput in = 
-	        apacheResolver.resolve(uriAttr, context.getBaseURI());
+	        ResourceResolver.getInstance(uriAttr, baseURI);
+            XMLSignatureInput in = apacheResolver.resolve(uriAttr, baseURI);
 	    if (in.isOctetStream()) {
 	        return new ApacheOctetStreamData(in);
 	    } else {

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMUtils.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMUtils.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMUtils.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMUtils.java Fri Jan 13 14:00:23 2006
@@ -248,7 +248,7 @@
      */
     public static void removeAllChildren(Node node) {
         NodeList children = node.getChildNodes();
-        for (int i = 0; i < children.getLength(); i++) {
+        for (int i = 0, length = children.getLength(); i < length; i++) {
             node.removeChild(children.item(i));
         }
     }
@@ -314,10 +314,11 @@
 
         List types = spec1.getXPathList();
         List otypes = spec2.getXPathList();
-        if (types.size() != otypes.size()) {
+	int size = types.size();
+        if (size != otypes.size()) {
             return false;
         }
-        for (int i=0; i<types.size(); i++) {
+        for (int i = 0; i < size; i++) {
             XPathType type = (XPathType) types.get(i);
             XPathType otype = (XPathType) otypes.get(i);
             if (!type.getExpression().equals(otype.getExpression()) ||

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXMLObject.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXMLObject.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXMLObject.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXMLObject.java Fri Jan 13 14:00:23 2006
@@ -63,7 +63,7 @@
             this.content = Collections.EMPTY_LIST;
         } else {
             List contentCopy = new ArrayList(content);
-            for (int i = 0; i < contentCopy.size(); i++) {
+            for (int i = 0, size = contentCopy.size(); i < size; i++) {
                 if (!(contentCopy.get(i) instanceof XMLStructure)) {
                     throw new ClassCastException
                         ("content["+i+"] is not a valid type");
@@ -90,24 +90,26 @@
         this.mimeType = DOMUtils.getAttributeValue(objElem, "MimeType");
 
 	NodeList nodes = objElem.getChildNodes();
-	List content = new ArrayList(nodes.getLength());
-	for (int i = 0; i < nodes.getLength(); i++) {
+	int length = nodes.getLength();
+	List content = new ArrayList(length);
+	for (int i = 0; i < length; i++) {
             Node child = nodes.item(i);
             if (child.getNodeType() == Node.ELEMENT_NODE) {
-                String tag = ((Element) child).getLocalName();
+		Element childElem = (Element) child;
+                String tag = childElem.getLocalName();
                 if (tag.equals("Manifest")) {
-                    content.add(new DOMManifest((Element) child, context));
+                    content.add(new DOMManifest(childElem, context));
 		    continue;
                 } else if (tag.equals("SignatureProperties")) {
-                    content.add(new DOMSignatureProperties((Element) child));
+                    content.add(new DOMSignatureProperties(childElem));
 		    continue;
                 } else if (tag.equals("X509Data")) {
-                    content.add(new DOMX509Data((Element) child));
+                    content.add(new DOMX509Data(childElem));
 		    continue;
 		}
 		//@@@FIXME: check for other dsig structures
 	    }
-	    content.add(new javax.xml.crypto.dom.DOMStructure(nodes.item(i)));
+	    content.add(new javax.xml.crypto.dom.DOMStructure(child));
 	}
         if (content.isEmpty()) {
             this.content = Collections.EMPTY_LIST;
@@ -145,9 +147,8 @@
         DOMUtils.setAttribute(objElem, "Encoding", encoding);
 
         // create and append any elements and mixed content, if necessary
-	Iterator i = content.iterator();
-	while (i.hasNext()) {
-            XMLStructure object = (XMLStructure) i.next();
+	for (int i = 0, size = content.size(); i < size; i++) {
+            XMLStructure object = (XMLStructure) content.get(i);
             if (object instanceof DOMStructure) {
                 ((DOMStructure) object).marshal(objElem, dsPrefix, context);
             } else {
@@ -185,7 +186,7 @@
 	if (content.size() != otherContent.size()) {
 	    return false;
 	}
-	for (int i = 0; i < otherContent.size(); i++) {
+	for (int i = 0, osize = otherContent.size(); i < osize; i++) {
 	    XMLStructure oxs = (XMLStructure) otherContent.get(i);
 	    XMLStructure xs = (XMLStructure) content.get(i);
 	    if (oxs instanceof javax.xml.crypto.dom.DOMStructure) {

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXMLSignature.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXMLSignature.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXMLSignature.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXMLSignature.java Fri Jan 13 14:00:23 2006
@@ -41,9 +41,7 @@
 import java.util.Collections;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
-import java.util.StringTokenizer;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.w3c.dom.Document;
@@ -62,8 +60,7 @@
 public final class DOMXMLSignature extends DOMStructure 
     implements XMLSignature {
 
-    static Logger log = Logger.getLogger(DOMXMLSignature.class.getName());
-    
+    private static Logger log = Logger.getLogger("org.jcp.xml.dsig.internal.dom");
     private String id;
     private SignatureValue sv;
     private KeyInfo ki;
@@ -107,7 +104,7 @@
             this.objects = Collections.EMPTY_LIST;
         } else {
             List objsCopy = new ArrayList(objs);
-            for (int i = 0; i < objsCopy.size(); i++) {
+            for (int i = 0, size = objsCopy.size(); i < size; i++) {
                 if (!(objsCopy.get(i) instanceof XMLObject)) {
                     throw new ClassCastException
                         ("objs["+i+"] is not an XMLObject");
@@ -134,7 +131,7 @@
 
 	// unmarshal SignedInfo
 	Element siElem = DOMUtils.getFirstChildElement(localSigElem);
-	si = new DOMSignedInfo(siElem, this, context);
+	si = new DOMSignedInfo(siElem, context);
 
 	// unmarshal SignatureValue 
 	Element sigValElem = DOMUtils.getNextSiblingElement(siElem);
@@ -209,7 +206,7 @@
         }
 
 	// create and append SignedInfo element
-	((DOMSignedInfo) si).marshal(sigElem, dsPrefix, context, this);
+	((DOMSignedInfo) si).marshal(sigElem, dsPrefix, context);
 
         // create and append SignatureValue element
 	((DOMSignatureValue) sv).marshal(sigElem, dsPrefix, context);
@@ -220,9 +217,8 @@
 	}
 
 	// create and append Object elements if necessary
-	Iterator i = objects.iterator();
-	while (i.hasNext()) {
-	    ((DOMXMLObject) i.next()).marshal(sigElem, dsPrefix, context);
+	for (int i = 0, size = objects.size(); i < size; i++) {
+	    ((DOMXMLObject) objects.get(i)).marshal(sigElem, dsPrefix, context);
 	}
 
 	// append Id attribute
@@ -243,17 +239,21 @@
 	}
 
         // validate all References
-        Iterator refs = this.si.getReferences().iterator();
+        List refs = this.si.getReferences();
         boolean validateRefs = true;
-        for (int counter = 0; validateRefs && refs.hasNext(); counter++) {
-            Reference ref = (Reference) refs.next();
+        for (int i = 0, size = refs.size(); validateRefs && i < size; i++) {
+            Reference ref = (Reference) refs.get(i);
             boolean refValid = ref.validate(vc);
-            log.log(Level.FINE, "Reference[" + ref.getURI() + "] is valid: " 
-		+ refValid);
+	    if (log.isLoggable(Level.FINE)) {
+                log.log(Level.FINE, "Reference[" + ref.getURI() + "] is valid: "
+		    + refValid);
+	    }
             validateRefs &= refValid;
         }
         if (!validateRefs) {
-            log.log(Level.FINE, "Couldn't validate the References");
+	    if (log.isLoggable(Level.FINE)) {
+                log.log(Level.FINE, "Couldn't validate the References");
+	    }
 	    validationStatus = false;
 	    validated = true;
 	    return validationStatus;
@@ -272,21 +272,26 @@
 	if (Boolean.TRUE.equals(vc.getProperty
 	    ("org.jcp.xml.dsig.validateManifests"))) {
 
-            Iterator oi = objects.iterator();
-            while (validateMans && oi.hasNext()) {
-                XMLObject xo = (XMLObject) oi.next();
-                Iterator ci = xo.getContent().iterator();
-                while (validateMans && ci.hasNext()) {
-                    XMLStructure xs = (XMLStructure) ci.next();
+	    for (int i=0, size=objects.size(); validateMans && i < size; i++) {
+                XMLObject xo = (XMLObject) objects.get(i);
+                List content = xo.getContent();
+		int csize = content.size();
+                for (int j = 0; validateMans && j < csize; j++) {
+                    XMLStructure xs = (XMLStructure) content.get(j);
                     if (xs instanceof Manifest) {
-                        log.log(Level.FINE, "validating manifest");
+	    		if (log.isLoggable(Level.FINE)) {
+                            log.log(Level.FINE, "validating manifest");
+			}
                         Manifest man = (Manifest) xs;
-                        Iterator ri = man.getReferences().iterator();
-                        for (int j=0; validateMans && ri.hasNext(); j++) {
-                            Reference ref = (Reference) ri.next();
+                        List manRefs = man.getReferences();
+			int rsize = manRefs.size();
+                        for (int k = 0; validateMans && k < rsize; k++) {
+                            Reference ref = (Reference) manRefs.get(k);
                             boolean refValid = ref.validate(vc);
-                            log.log(Level.FINE, "Manifest ref[" + ref.getURI() 
-				+ "] is valid: " + refValid);
+	    		    if (log.isLoggable(Level.FINE)) {
+                                log.log(Level.FINE, "Manifest ref[" 
+				    + ref.getURI() + "] is valid: " + refValid);
+			    }
 			    validateMans &= refValid;
 			}
                     }
@@ -318,24 +323,23 @@
 	signatureIdMap = new HashMap();
 	signatureIdMap.put(id, this);
 	signatureIdMap.put(si.getId(), si);
-	Iterator iter = si.getReferences().iterator();
-	while (iter.hasNext()) {
-            Reference ref = (Reference) iter.next();
+	List refs = si.getReferences();
+	for (int i = 0, size = refs.size(); i < size; i++) {
+            Reference ref = (Reference) refs.get(i);
             signatureIdMap.put(ref.getId(), ref);
 	}
-        iter = objects.iterator();
-	while (iter.hasNext()) {
-            XMLObject obj = (XMLObject) iter.next();
+	for (int i = 0, size = objects.size(); i < size; i++) {
+            XMLObject obj = (XMLObject) objects.get(i);
             signatureIdMap.put(obj.getId(), obj);
-            Iterator contIter = obj.getContent().iterator();
-            while (contIter.hasNext()) {
-		XMLStructure xs = (XMLStructure) contIter.next();
+            List content = obj.getContent();
+	    for (int j = 0, csize = content.size(); j < csize; j++) {
+		XMLStructure xs = (XMLStructure) content.get(j);
 		if (xs instanceof Manifest) {
                     Manifest man = (Manifest) xs;
                     signatureIdMap.put(man.getId(), man);
-                    Iterator manIter = man.getReferences().iterator();
-                    while (manIter.hasNext()) {
-			Reference ref = (Reference) manIter.next();
+                    List manRefs = man.getReferences();
+		    for (int k = 0, msize = manRefs.size(); k < msize; k++) {
+			Reference ref = (Reference) manRefs.get(k);
 			allReferences.add(ref);
 			signatureIdMap.put(ref.getId(), ref);
                     }
@@ -344,16 +348,14 @@
 	}
 
         // generate/digest each reference
-	iter = allReferences.iterator();
-	while (iter.hasNext()) {
-            DOMReference ref = (DOMReference) iter.next();
+	for (int i = 0, size = allReferences.size(); i < size; i++) {
+            DOMReference ref = (DOMReference) allReferences.get(i);
             digestReference(ref, signContext);
 	}
 
         // do final sweep to digest any references that were skipped or missed
-	iter = allReferences.iterator();
-	while (iter.hasNext()) {
-            DOMReference ref = (DOMReference) iter.next();
+	for (int i = 0, size = allReferences.size(); i < size; i++) {
+            DOMReference ref = (DOMReference) allReferences.get(i);
             if (ref.isDigested()) {
 		continue;
             }
@@ -376,17 +378,17 @@
 	}
 
 	// calculate signature value
-	byte[] signedInfoBytes = ((DOMSignedInfo) si).canonicalize(signContext);
-
 	byte[] val = null;
 	try {
             val = ((DOMSignatureMethod) si.getSignatureMethod()).sign
-		(signingKey, signedInfoBytes);
+		(signingKey, (DOMSignedInfo) si, signContext);
 	} catch (InvalidKeyException ike) {
             throw new XMLSignatureException(ike);
 	}
 
-        log.log(Level.FINE, "SignatureValue = " + val);        
+	if (log.isLoggable(Level.FINE)) {
+            log.log(Level.FINE, "SignatureValue = " + val);        
+	}
 	((DOMSignatureValue) sv).setValue(val);
 
         this.localSigElem = sigElem;   
@@ -430,10 +432,10 @@
                     digestReference((DOMReference) obj, signContext);
 		} else if (obj instanceof Manifest) {
                     Manifest man = (Manifest) obj;
-                    Iterator iter = man.getReferences().iterator();
-                    while (iter.hasNext()) {
+                    List manRefs = man.getReferences();
+		    for (int i = 0, size = manRefs.size(); i < size; i++) {
 			digestReference
-                 	    ((DOMReference) iter.next(), signContext);
+                 	    ((DOMReference) manRefs.get(i), signContext);
 		    }
 		}
             }
@@ -441,11 +443,12 @@
 	    // reference dependencies in the XPath Transform - so be on
 	    // the safe side, and skip and do at end in the final sweep
 	    if (uri.length() == 0) {
-		Iterator iter = ref.getTransforms().iterator();
-		while (iter.hasNext()) {
-		    Transform transform = (Transform) iter.next();
-		    if (transform.getAlgorithm().equals(Transform.XPATH) ||
-			transform.getAlgorithm().equals(Transform.XPATH2)) {
+		List transforms = ref.getTransforms();
+		for (int i = 0, size = transforms.size(); i < size; i++) {
+		    Transform transform = (Transform) transforms.get(i);
+		    String transformAlg = transform.getAlgorithm();
+		    if (transformAlg.equals(Transform.XPATH) ||
+			transformAlg.equals(Transform.XPATH2)) {
                 	return;
                     }
             	}
@@ -469,16 +472,6 @@
 	}
 
 	DOMSignatureValue(Element sigValueElem) throws MarshalException {
-	    String signatureValue = sigValueElem.getFirstChild().getNodeValue();
-            // strip ignoreable whitespace from signature value
-            StringTokenizer tokenizer = new StringTokenizer
-	        (signatureValue, " \n\r\t", false);
-            StringBuffer svBuf = new StringBuffer(signatureValue.length());
-            while (tokenizer.hasMoreElements()) {
-                svBuf.append(tokenizer.nextToken());
-            }
-	    valueBase64 = svBuf.toString();
-
 	    try {
 	        // base64 decode signatureValue
 	        value = Base64.decode(sigValueElem);
@@ -526,14 +519,10 @@
 		    "key", kse);
 	    }
 
-	    // canonicalize SignedInfo
-	    byte[] siBytes = 
-		((DOMSignedInfo) si).canonicalize(validateContext);
-
-	    // verify signature
+	    // canonicalize SignedInfo and verify signature
 	    try {
 		validationStatus = ((DOMSignatureMethod) sm).verify
-		    (validationKey, siBytes, value);
+		    (validationKey, (DOMSignedInfo) si, value, validateContext);
 	    } catch (Exception e) {
 		throw new XMLSignatureException(e);
 	    }

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXMLSignatureFactory.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXMLSignatureFactory.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXMLSignatureFactory.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXMLSignatureFactory.java Fri Jan 13 14:00:23 2006
@@ -30,10 +30,7 @@
 
 import java.security.*;
 import java.security.spec.AlgorithmParameterSpec;
-import java.util.Iterator;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -45,8 +42,6 @@
  */
 public final class DOMXMLSignatureFactory extends XMLSignatureFactory {
 
-    static Logger log = Logger.getLogger(DOMXMLSignatureFactory.class.getName());
-
     static {
         AccessController.doPrivileged(new PrivilegedAction() {
             public Object run() {
@@ -178,7 +173,6 @@
 	    throw new MarshalException("Document implementation must " +
 		"support DOM Level 2 and be namespace aware");
 	}
-        log.log(Level.FINE, "unmarshalling element: " + tag );
         if (tag.equals("Signature")) {
             return new DOMXMLSignature(element, context);
         } else {

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXPathFilter2Transform.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXPathFilter2Transform.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXPathFilter2Transform.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXPathFilter2Transform.java Fri Jan 13 14:00:23 2006
@@ -97,8 +97,9 @@
             }
 	    NamedNodeMap attributes = curXPathElem.getAttributes();
 	    if (attributes != null) {
-	        Map namespaceMap = new HashMap(attributes.getLength());
-	        for (int i = 0; i < attributes.getLength(); i++) {
+		int length = attributes.getLength();
+	        Map namespaceMap = new HashMap(length);
+	        for (int i = 0; i < length; i++) {
 	    	    Attr attr = (Attr) attributes.item(i);
 	    	    String prefix = attr.getPrefix();
 	    	    if (prefix != null && prefix.equals("xmlns")) {
@@ -122,27 +123,23 @@
 	XPathFilter2ParameterSpec xp = 
 	    (XPathFilter2ParameterSpec) getParameterSpec();
         String prefix = DOMUtils.getNSPrefix(context, Transform.XPATH2);
-	Iterator list = xp.getXPathList().iterator();
-        while (list.hasNext()) {               
-            XPathType xpathType = (XPathType)list.next();
+	String qname = (prefix == null) ? "xmlns" : "xmlns:" + prefix;
+	List list = xp.getXPathList();
+	for (int i = 0, size = list.size(); i < size; i++) {
+            XPathType xpathType = (XPathType) list.get(i);
             Element elem = DOMUtils.createElement
                 (ownerDoc, "XPath", Transform.XPATH2, prefix);
             elem.appendChild
 		(ownerDoc.createTextNode(xpathType.getExpression()));
 	    DOMUtils.setAttribute
 		(elem, "Filter", xpathType.getFilter().toString());
-	    if (prefix == null) {
-                elem.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", 
-		    Transform.XPATH2);
-	    } else {
-                elem.setAttributeNS("http://www.w3.org/2000/xmlns/", 
-		    "xmlns:" + prefix, Transform.XPATH2);
-	    }
+            elem.setAttributeNS("http://www.w3.org/2000/xmlns/", qname, 
+	        Transform.XPATH2);
 
             // add namespace attributes, if necessary
-            Iterator i = xpathType.getNamespaceMap().entrySet().iterator();
-            while (i.hasNext()) {
-                Map.Entry entry = (Map.Entry) i.next();
+            Iterator it = xpathType.getNamespaceMap().entrySet().iterator();
+            while (it.hasNext()) {
+                Map.Entry entry = (Map.Entry) it.next();
                 elem.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:"
                     + (String) entry.getKey(), (String) entry.getValue());
             }

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXPathTransform.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXPathTransform.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXPathTransform.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/DOMXPathTransform.java Fri Jan 13 14:00:23 2006
@@ -65,8 +65,9 @@
         // create a Map of namespace prefixes
         NamedNodeMap attributes = paramsElem.getAttributes();
         if (attributes != null) {
-            Map namespaceMap = new HashMap(attributes.getLength());
-	    for (int i = 0; i < attributes.getLength(); i++) {
+	    int length = attributes.getLength();
+            Map namespaceMap = new HashMap(length);
+	    for (int i = 0; i < length; i++) {
 	        Attr attr = (Attr) attributes.item(i);
 	        String prefix = attr.getPrefix();
 	        if (prefix != null && prefix.equals("xmlns")) {

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/Utils.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/Utils.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/Utils.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/Utils.java Fri Jan 13 14:00:23 2006
@@ -42,13 +42,13 @@
 	throws IOException {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         byte[] buf = new byte[1024];
-        while(true) {
+        while (true) {
             int read = is.read(buf);
 	    if (read == -1) { // EOF
 		break;
 	    }
             baos.write(buf, 0, read);
-            if(read < 1024) {
+            if (read < 1024) {
                 break;
             }
         }
@@ -70,7 +70,7 @@
 	    // insert attributes nodes to comply with XPath
 	    if (n.getNodeType() == Node.ELEMENT_NODE) {
 	        NamedNodeMap nnm = n.getAttributes();
-		for (int j=0; j < nnm.getLength(); j++) {
+		for (int j = 0, length = nnm.getLength(); j < length; j++) {
 		    nodeSet.add(nnm.item(j));
 		}
 	    }
@@ -98,6 +98,6 @@
      * Returns true if uri is a same-document URI, false otherwise.
      */
     public static boolean sameDocumentURI(String uri) {
-	return (uri != null && (uri.length() == 0 || uri.startsWith("#")));
+	return (uri != null && (uri.length() == 0 || uri.charAt(0) == '#'));
     }
 }

Modified: xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/XMLDSigRI.java
URL: http://svn.apache.org/viewcvs/xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/XMLDSigRI.java?rev=368871&r1=368870&r2=368871&view=diff
==============================================================================
--- xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/XMLDSigRI.java (original)
+++ xml/security/branches/jsr105_0_16/src/org/jcp/xml/dsig/internal/dom/XMLDSigRI.java Fri Jan 13 14:00:23 2006
@@ -63,82 +63,75 @@
 
 
 	// Inclusive C14N
-	map.put("TransformService." + CanonicalizationMethod.INCLUSIVE,
+	map.put((String)"TransformService." + CanonicalizationMethod.INCLUSIVE,
 		"org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod");
 	map.put("Alg.Alias.TransformService.INCLUSIVE", 
 		CanonicalizationMethod.INCLUSIVE);
-	map.put("TransformService." + CanonicalizationMethod.INCLUSIVE +
+	map.put((String)"TransformService." + CanonicalizationMethod.INCLUSIVE +
 		" MechanismType", "DOM");
 
 	// InclusiveWithComments C14N
-	map.put("TransformService." + 
+	map.put((String) "TransformService." + 
 		CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS,
 		"org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod");
 	map.put("Alg.Alias.TransformService.INCLUSIVE_WITH_COMMENTS", 
 		CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS);
-	map.put("TransformService." + 
+	map.put((String) "TransformService." + 
 		CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS + 
 		" MechanismType", "DOM");
 
 	// Exclusive C14N
-	map.put("TransformService." + CanonicalizationMethod.EXCLUSIVE,
+	map.put((String) "TransformService." + CanonicalizationMethod.EXCLUSIVE,
 		"org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod");
 	map.put("Alg.Alias.TransformService.EXCLUSIVE", 
 		CanonicalizationMethod.EXCLUSIVE);
-	map.put("TransformService." + CanonicalizationMethod.EXCLUSIVE +
+	map.put((String)"TransformService." + CanonicalizationMethod.EXCLUSIVE +
 		" MechanismType", "DOM");
 
 	// ExclusiveWithComments C14N
-	map.put("TransformService." + 
+	map.put((String) "TransformService." + 
 		CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS,
 		"org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod");
 	map.put("Alg.Alias.TransformService.EXCLUSIVE_WITH_COMMENTS", 
 		CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS);
-	map.put("TransformService." + 
+	map.put((String) "TransformService." + 
 		CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS +
 		" MechanismType", "DOM");
 
 	// Base64 Transform
-	map.put("TransformService." + Transform.BASE64,
+	map.put((String) "TransformService." + Transform.BASE64,
 		"org.jcp.xml.dsig.internal.dom.DOMBase64Transform");
 	map.put("Alg.Alias.TransformService.BASE64", Transform.BASE64);
-	map.put("TransformService." + Transform.BASE64 + " MechanismType",
-		"DOM");
+	map.put((String) "TransformService." + Transform.BASE64 + 
+		" MechanismType", "DOM");
 
 	// Enveloped Transform
-	map.put("TransformService." + Transform.ENVELOPED,
+	map.put((String) "TransformService." + Transform.ENVELOPED,
 		"org.jcp.xml.dsig.internal.dom.DOMEnvelopedTransform");
 	map.put("Alg.Alias.TransformService.ENVELOPED", Transform.ENVELOPED);
-	map.put("TransformService." + Transform.ENVELOPED + 
+	map.put((String) "TransformService." + Transform.ENVELOPED + 
 		" MechanismType", "DOM");
 
 	// XPath2 Transform
-	map.put("TransformService." + Transform.XPATH2,
+	map.put((String) "TransformService." + Transform.XPATH2,
 		"org.jcp.xml.dsig.internal.dom.DOMXPathFilter2Transform");
 	map.put("Alg.Alias.TransformService.XPATH2", Transform.XPATH2);
-	map.put("TransformService." + Transform.XPATH2 + " MechanismType",
-		"DOM");
+	map.put((String) "TransformService." + Transform.XPATH2 + 
+		" MechanismType", "DOM");
 
 	// XPath Transform
-	map.put("TransformService." + Transform.XPATH,
+	map.put((String) "TransformService." + Transform.XPATH,
 		"org.jcp.xml.dsig.internal.dom.DOMXPathTransform");
 	map.put("Alg.Alias.TransformService.XPATH", Transform.XPATH);
-	map.put("TransformService." + Transform.XPATH + " MechanismType",
-		"DOM");
+	map.put((String) "TransformService." + Transform.XPATH + 
+		" MechanismType", "DOM");
 
 	// XSLT Transform
-	map.put("TransformService." + Transform.XSLT,
+	map.put((String) "TransformService." + Transform.XSLT,
 		"org.jcp.xml.dsig.internal.dom.DOMXSLTTransform");
 	map.put("Alg.Alias.TransformService.XSLT", Transform.XSLT);
-	map.put("TransformService." + Transform.XSLT + " MechanismType",
-		"DOM");
-
-	// SHA1 DigestMethod
-	map.put("TransformService." + DigestMethod.SHA1,
-		"org.jcp.xml.dsig.internal.dom.DOMSHA1DigestMethod");
-	map.put("Alg.Alias.TransformService.SHA1", DigestMethod.SHA1);
-	map.put("TransformService." + DigestMethod.SHA1 + " MechanismType",
-		"DOM");
+	map.put((String) "TransformService." + Transform.XSLT + 
+		" MechanismType", "DOM");
 
 	AccessController.doPrivileged(new java.security.PrivilegedAction() {
 	    public Object run() {