Author: dkulp
Date: Fri Mar  6 21:45:26 2009
New Revision: 751089

URL: http://svn.apache.org/viewvc?rev=751089&view=rev
Log:
While decrypting and signature verification, record the qnames of elements so 
policy validation can be done later

Modified:
    webservices/wss4j/trunk/src/org/apache/ws/security/WSDataRef.java
    
webservices/wss4j/trunk/src/org/apache/ws/security/WSSecurityEngineResult.java
    
webservices/wss4j/trunk/src/org/apache/ws/security/processor/EncryptedKeyProcessor.java
    
webservices/wss4j/trunk/src/org/apache/ws/security/processor/ReferenceListProcessor.java
    
webservices/wss4j/trunk/src/org/apache/ws/security/processor/SignatureProcessor.java

Modified: webservices/wss4j/trunk/src/org/apache/ws/security/WSDataRef.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/WSDataRef.java?rev=751089&r1=751088&r2=751089&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/WSDataRef.java (original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/WSDataRef.java Fri Mar  
6 21:45:26 2009
@@ -18,7 +18,7 @@
 package org.apache.ws.security;
 
 /**
- * WSDataRef stores information about decrypted elements
+ * WSDataRef stores information about decrypted/signed elements
  * 
  * When a processor decrypts an elements it stores information 
  * about that element in a WSDataRef so these information can 

Modified: 
webservices/wss4j/trunk/src/org/apache/ws/security/WSSecurityEngineResult.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/WSSecurityEngineResult.java?rev=751089&r1=751088&r2=751089&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/org/apache/ws/security/WSSecurityEngineResult.java 
(original)
+++ 
webservices/wss4j/trunk/src/org/apache/ws/security/WSSecurityEngineResult.java 
Fri Mar  6 21:45:26 2009
@@ -202,7 +202,18 @@
         this(act, princ, certificate, elements, sv);
         put(TAG_PROTECTED_ELEMENTS, protectedElements);
     }
-
+    public
+    WSSecurityEngineResult(
+        int act,
+        Principal princ,
+        X509Certificate certificate,
+        Set elements,
+        List dataRefs,
+        byte[] sv
+    ) {
+        this(act, princ, certificate, elements, sv);
+        put(TAG_DATA_REF_URIS, dataRefs);
+    }
     public WSSecurityEngineResult(
         int act, 
         byte[] decryptedKey, 
@@ -216,6 +227,21 @@
         put(TAG_ENCRYPTED_KEY_ID, encyptedKeyId);
         put(TAG_DATA_REF_URIS, dataRefUris);
     }
+    public WSSecurityEngineResult(
+                                  int act, 
+                                  byte[] decryptedKey, 
+                                  byte[] encryptedKeyBytes,
+                                  String encyptedKeyId, 
+                                  List dataRefUris,
+                                  X509Certificate cert
+    ) {
+        put(TAG_ACTION, new Integer(act));
+        put(TAG_DECRYPTED_KEY, decryptedKey);
+        put(TAG_ENCRYPTED_EPHEMERAL_KEY, encryptedKeyBytes);
+        put(TAG_ENCRYPTED_KEY_ID, encyptedKeyId);
+        put(TAG_DATA_REF_URIS, dataRefUris);
+        put(TAG_X509_CERTIFICATE, cert);
+    }
     
     public WSSecurityEngineResult(int act, ArrayList dataRefUris) {
         put(TAG_ACTION, new Integer(act));

Modified: 
webservices/wss4j/trunk/src/org/apache/ws/security/processor/EncryptedKeyProcessor.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/processor/EncryptedKeyProcessor.java?rev=751089&r1=751088&r2=751089&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/org/apache/ws/security/processor/EncryptedKeyProcessor.java
 (original)
+++ 
webservices/wss4j/trunk/src/org/apache/ws/security/processor/EncryptedKeyProcessor.java
 Fri Mar  6 21:45:26 2009
@@ -64,6 +64,7 @@
     private byte[] decryptedBytes = null;
     
     private String encryptedKeyId = null;
+    private X509Certificate cert = null;
 
     public void handleToken(
             Element elem, 
@@ -92,7 +93,8 @@
                 this.decryptedBytes,
                 this.encryptedEphemeralKey,
                 this.encryptedKeyId, 
-                dataRefUris
+                dataRefUris,
+                cert
             )
         );
     }
@@ -222,6 +224,7 @@
                     // the private key associated with this certificate
                     //
                     alias = crypto.getAliasForX509Cert(certs[0]);
+                    cert = certs[0];
                     if (log.isDebugEnabled()) {
                         log.debug("cert: " + certs[0]);
                         log.debug("KeyIdentifier Alias: " + alias);
@@ -242,7 +245,7 @@
                                 new Object[] {"for decryption (BST)"}
                             );
                         }
-                        X509Certificate cert = 
token.getX509Certificate(crypto);
+                        cert = token.getX509Certificate(crypto);
                         if (cert == null) {
                             throw new WSSecurityException(
                                 WSSecurityException.FAILURE,

Modified: 
webservices/wss4j/trunk/src/org/apache/ws/security/processor/ReferenceListProcessor.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/processor/ReferenceListProcessor.java?rev=751089&r1=751088&r2=751089&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/org/apache/ws/security/processor/ReferenceListProcessor.java
 (original)
+++ 
webservices/wss4j/trunk/src/org/apache/ws/security/processor/ReferenceListProcessor.java
 Fri Mar  6 21:45:26 2009
@@ -110,7 +110,7 @@
             if (tmpE.getLocalName().equals("DataReference")) {
                 String dataRefURI = ((Element) tmpE).getAttribute("URI");
                 WSDataRef dataRef = new WSDataRef(dataRefURI.substring(1));
-                decryptDataRefEmbedded(doc, dataRefURI, dataRef,cb, crypto);
+                decryptDataRefEmbedded(doc, dataRefURI, dataRef, cb, crypto);
                 dataRefUris.add(dataRef);
             }
         }
@@ -185,6 +185,7 @@
 
         if (content) {
             encBodyData = (Element) encBodyData.getParentNode();
+            dataRef.setName(new QName(encBodyData.getNamespaceURI(), 
encBodyData.getLocalName()));
         }
             
         try {
@@ -378,12 +379,12 @@
     }
 
     /**
-     * @return      a list of Nodes in b that are not in a 
+     * @return a list of Nodes in b that are not in a
      */
     private static java.util.List
     newNodes(
-        final java.util.List a,
-        final java.util.List b
+        java.util.List a,
+        java.util.List b
     ) {
         if (a.size() == 0) {
             return b;
@@ -391,6 +392,20 @@
         if (b.size() == 0) {
             return java.util.Collections.EMPTY_LIST;
         }
+        
+        a = new ArrayList(a);
+        //try a fast node compare at same position first.....
+        for (int x = 0; x < b.size(); x++) {
+            final Node bnode = (Node)b.get(x);
+            final Node anode = (Node)a.get(x);
+            if (bnode == anode
+                || bnode.getLocalName().equals(anode.getLocalName())
+                && bnode.getNamespaceURI().equals(anode.getNamespaceURI())) {
+                b.remove(x);
+                a.remove(x);
+            }
+        }
+        //what's left is stuff that didn't exactly position match, do slower 
searches
         final java.util.List ret = new java.util.ArrayList();
         for (
             final java.util.Iterator bpos = b.iterator();
@@ -402,7 +417,7 @@
             boolean found = false;
             for (
                 final java.util.Iterator apos = a.iterator();
-                apos.hasNext();
+                apos.hasNext() && !found;
             ) {
                 final Node anode = (Node) apos.next();
                 final java.lang.String ans = anode.getNamespaceURI();

Modified: 
webservices/wss4j/trunk/src/org/apache/ws/security/processor/SignatureProcessor.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/processor/SignatureProcessor.java?rev=751089&r1=751088&r2=751089&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/org/apache/ws/security/processor/SignatureProcessor.java
 (original)
+++ 
webservices/wss4j/trunk/src/org/apache/ws/security/processor/SignatureProcessor.java
 Fri Mar  6 21:45:26 2009
@@ -24,6 +24,7 @@
 import org.apache.ws.security.PublicKeyCallback;
 import org.apache.ws.security.PublicKeyPrincipal;
 import org.apache.ws.security.WSConstants;
+import org.apache.ws.security.WSDataRef;
 import org.apache.ws.security.WSDerivedKeyTokenPrincipal;
 import org.apache.ws.security.WSDocInfo;
 import org.apache.ws.security.WSDocInfoStore;
@@ -63,6 +64,7 @@
 import java.security.cert.CertificateNotYetValidException;
 import java.security.cert.X509Certificate;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.Vector;
 
@@ -87,14 +89,15 @@
         WSDocInfoStore.store(wsDocInfo);
         X509Certificate[] returnCert = new X509Certificate[1];
         Set returnElements = new HashSet();
-        Set protectedElements = new java.util.TreeSet();
+        List protectedElements = new java.util.ArrayList();
         byte[][] signatureValue = new byte[1][];
         Principal lastPrincipalFound = null;
         
         try {
             lastPrincipalFound = 
                 verifyXMLSignature(
-                    elem, crypto, returnCert, returnElements, 
protectedElements, signatureValue, cb
+                    elem, crypto, returnCert, returnElements,
+                    protectedElements, signatureValue, cb
                 );
         } catch (WSSecurityException ex) {
             throw ex;
@@ -173,7 +176,7 @@
         Crypto crypto,
         X509Certificate[] returnCert,
         Set returnElements,
-        Set protectedElements,
+        List protectedElements,
         byte[][] signatureValue,
         CallbackHandler cb
     ) throws WSSecurityException {
@@ -452,6 +455,10 @@
                         if (se == null) {
                             throw new 
WSSecurityException(WSSecurityException.FAILED_CHECK);
                         }
+                        WSDataRef ref = new WSDataRef(uri);
+                        ref.setWsuId(uri);
+                        ref.setName(new QName(se.getNamespaceURI(), 
se.getLocalName()));
+                        protectedElements.add(ref);
                         
returnElements.add(WSSecurityUtil.getIDFromReference(uri));
                     } else {
                        // This is the case where the signed element is 
identified 



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to