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() {