You are viewing a plain text version of this content. The canonical link for it is here.
Posted to wss4j-dev@ws.apache.org by ru...@apache.org on 2007/10/26 10:40:10 UTC

svn commit: r588559 - in /webservices/wss4j/trunk: src/org/apache/ws/security/ src/org/apache/ws/security/action/ src/org/apache/ws/security/message/ src/org/apache/ws/security/message/token/ src/org/apache/ws/security/processor/ test/wssec/

Author: ruchithf
Date: Fri Oct 26 01:40:09 2007
New Revision: 588559

URL: http://svn.apache.org/viewvc?rev=588559&view=rev
Log:
Applied patch in WSS-92. Thanks Nandana


Modified:
    webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java
    webservices/wss4j/trunk/src/org/apache/ws/security/WSPasswordCallback.java
    webservices/wss4j/trunk/src/org/apache/ws/security/action/EncryptionAction.java
    webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecEncrypt.java
    webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecEncryptedKey.java
    webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecSignature.java
    webservices/wss4j/trunk/src/org/apache/ws/security/message/token/SecurityTokenReference.java
    webservices/wss4j/trunk/src/org/apache/ws/security/processor/DerivedKeyTokenProcessor.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
    webservices/wss4j/trunk/test/wssec/TestWSSecurityNew10.java
    webservices/wss4j/trunk/test/wssec/TestWSSecurityNew9.java

Modified: webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java?rev=588559&r1=588558&r2=588559&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java (original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java Fri Oct 26 01:40:09 2007
@@ -65,6 +65,12 @@
     public static final String ENC_KEY_VALUE_TYPE = "EncryptedKey";
     
     /*
+     * The relative URI to be used for encrypted key SHA1 (Without #)
+     * Combine it with SOAPMESSAGE_NS11, #, to get the full URL
+     */
+    public static final String ENC_KEY_SHA1_URI = "EncryptedKeySHA1";
+    
+    /*
      * The namespace prefixes used. We uses the same prefix convention
      * as shown in the specifications
      */
@@ -357,6 +363,20 @@
      * The signing key, reference id and value type are set externally. 
      */
     public static final int CUSTOM_SYMM_SIGNING = 9;
+    
+    /**
+     * <code>ENCRYPTED_KEY_SHA1_IDENTIFIER</code> is used to set the specific key identifier
+     * ThumbprintSHA1.
+     * 
+     * This identifier uses the SHA-1 digest of a security token to
+     * identify the security token. Please refer to chapter 7.3 of the OASIS WSS 1.1
+     * specification.
+     * 
+     */
+    public static final int ENCRYPTED_KEY_SHA1_IDENTIFIER = 10;
+    
+    
+    public static final String ENCRYPTED_HEADER = "EncryptedHeader";
 
     /*
      * The following values are bits that can be combined to for a set.

Modified: webservices/wss4j/trunk/src/org/apache/ws/security/WSPasswordCallback.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/WSPasswordCallback.java?rev=588559&r1=588558&r2=588559&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/WSPasswordCallback.java (original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/WSPasswordCallback.java Fri Oct 26 01:40:09 2007
@@ -74,6 +74,7 @@
     public static final int USERNAME_TOKEN_UNKNOWN = 5;
     public final static int SECURITY_CONTEXT_TOKEN = 6;
     public final static int CUSTOM_TOKEN = 7;
+    public final static int ENCRYPTED_KEY_TOKEN = 8;
 
     private String identifier;
     private String password;
@@ -181,4 +182,5 @@
         this.customToken = customToken;
     }
 }
+
 

Modified: webservices/wss4j/trunk/src/org/apache/ws/security/action/EncryptionAction.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/action/EncryptionAction.java?rev=588559&r1=588558&r2=588559&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/action/EncryptionAction.java (original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/action/EncryptionAction.java Fri Oct 26 01:40:09 2007
@@ -46,6 +46,7 @@
                             WSHandlerConstants.ENC_CALLBACK_REF, reqData)
                             .getKey();
             wsEncrypt.setKey(embeddedKey);
+            wsEncrypt.setDocument(doc);
         }
         if (reqData.getEncSymmAlgo() != null) {
             wsEncrypt.setSymmetricEncAlgorithm(reqData.getEncSymmAlgo());

Modified: webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecEncrypt.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecEncrypt.java?rev=588559&r1=588558&r2=588559&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecEncrypt.java (original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecEncrypt.java Fri Oct 26 01:40:09 2007
@@ -19,6 +19,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.ws.security.SOAP11Constants;
 import org.apache.ws.security.SOAPConstants;
 import org.apache.ws.security.WSConstants;
 import org.apache.ws.security.WSEncryptionPart;
@@ -31,8 +32,11 @@
 import org.apache.xml.security.encryption.XMLCipher;
 import org.apache.xml.security.encryption.XMLEncryptionException;
 import org.apache.xml.security.keys.KeyInfo;
+import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
 
 import javax.crypto.KeyGenerator;
 import javax.crypto.SecretKey;
@@ -59,6 +63,8 @@
     protected byte[] embeddedKey = null;
 
     protected String embeddedKeyName = null;
+    
+    protected boolean useKeyIdentifier;
 
     /**
      * Symmetric key used in the EncrytpedKey.
@@ -117,6 +123,15 @@
     public void setEmbeddedKeyName(String embeddedKeyName) {
         this.embeddedKeyName = embeddedKeyName;
     }
+    
+    /**
+     * Set this true if a key identifier must be used in the KeyInfo
+     * 
+     * @param useKeyIdentifier
+     */
+    public void setUseKeyIdentifier(boolean useKeyIdentifier) {
+        this.useKeyIdentifier = useKeyIdentifier;
+    }
 
     /**
      * Set the name of the symmetric encryption algorithm to use.
@@ -150,7 +165,7 @@
     public void setEncCanonicalization(String algo) {
         encCanonAlgo = algo;
     }
-
+    
     /**
      * Get the name of symmetric encryption algorithm to use.
      * 
@@ -166,6 +181,14 @@
     public String getSymmetricEncAlgorithm() {
         return symEncAlgo;
     }
+    
+    /**
+     * Returns if Key Identifiers should be used in KeyInfo
+     * @return
+     */
+    public boolean getUseKeyIdentifier() {
+        return useKeyIdentifier;
+    }
 
     /**
      * Initialize a WSSec Encrypt.
@@ -403,7 +426,21 @@
 
     private Vector doEncryption(Document doc, SecretKey secretKey,
             Vector references) throws WSSecurityException {
-        return doEncryption(doc, secretKey, null, references);
+    	
+    	KeyInfo keyInfo = null;
+    	
+    	// Prepare KeyInfo if useKeyIdentifier is set
+    	if ( useKeyIdentifier && 
+    			 keyIdentifierType == WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER) {
+            
+    		keyInfo = new KeyInfo(document);
+            SecurityTokenReference secToken = new SecurityTokenReference(document);
+            secToken.setKeyIdentifierEncKeySHA1(secretKey.getEncoded());
+
+            keyInfo.addUnknownElement(secToken.getElement());
+    	} 
+    	
+        return doEncryption(doc, secretKey, keyInfo, references);
     }
 
     private Vector doEncryption(Document doc, SecretKey secretKey,
@@ -441,7 +478,7 @@
                             .getDocumentElement(), idToEnc, null);
                 }
             } else {
-                body = (Element) WSSecurityUtil.findElement(envelope, elemName,
+                body = (Element) WSSecurityUtil.findElement(document, elemName,
                         nmSpace);
             }
             if (body == null) {
@@ -468,11 +505,40 @@
              * xenc:EncryptedData
              */
             try {
-                xmlCipher.init(XMLCipher.ENCRYPT_MODE, secretKey);
-                EncryptedData encData = xmlCipher.getEncryptedData();
-                encData.setId(xencEncryptedDataId);
-                encData.setKeyInfo(keyInfo);
-                xmlCipher.doFinal(doc, body, content);
+            	
+            	if (modifier.equals("Header")) {
+            		
+                    Element elem = doc.createElementNS(WSConstants.WSSE11_NS,"wsse11:"+WSConstants.ENCRYPTED_HEADER);
+                    NamedNodeMap map = body.getAttributes();
+                    
+                    for (int i = 0 ; i < map.getLength() ; i++) {
+                    	Attr attr = (Attr)map.item(i);
+                    	if (attr.getNamespaceURI().equals(WSConstants.URI_SOAP11_ENV)
+                    			|| attr.getNamespaceURI().equals(WSConstants.URI_SOAP12_ENV)) {
+                    		elem.setAttributeNode(attr);
+                    	}
+                    }
+            		
+            	    xmlCipher.init(XMLCipher.ENCRYPT_MODE, secretKey);
+                    EncryptedData encData = xmlCipher.getEncryptedData();
+                    encData.setId(xencEncryptedDataId);
+                    encData.setKeyInfo(keyInfo);
+                    xmlCipher.doFinal(doc, body, content);
+                    
+                    Element encDataElem = WSSecurityUtil.findElementById(document
+                            .getDocumentElement(), xencEncryptedDataId, null);
+                    Node clone = encDataElem.cloneNode(true);
+                    elem.appendChild(clone);
+                    encDataElem.getParentNode().appendChild(elem);
+                    encDataElem.getParentNode().removeChild(encDataElem); 
+                    
+            	} else {
+            	    xmlCipher.init(XMLCipher.ENCRYPT_MODE, secretKey);
+                    EncryptedData encData = xmlCipher.getEncryptedData();
+                    encData.setId(xencEncryptedDataId);
+                    encData.setKeyInfo(keyInfo);
+                    xmlCipher.doFinal(doc, body, content);    		
+            	}
                 if(cloneKeyInfo) {
                     keyInfo = null;
                 }

Modified: webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecEncryptedKey.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecEncryptedKey.java?rev=588559&r1=588558&r2=588559&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecEncryptedKey.java (original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecEncryptedKey.java Fri Oct 26 01:40:09 2007
@@ -33,6 +33,7 @@
 import org.apache.ws.security.message.token.Reference;
 import org.apache.ws.security.message.token.SecurityTokenReference;
 import org.apache.ws.security.message.token.X509Security;
+import org.apache.ws.security.util.UUIDGenerator;
 import org.apache.ws.security.util.WSSecurityUtil;
 import org.apache.xml.security.keys.KeyInfo;
 import org.apache.xml.security.keys.content.X509Data;
@@ -185,7 +186,7 @@
      */
     protected void prepareInternal(byte[] keyBytes, X509Certificate remoteCert,
             Crypto crypto) throws WSSecurityException {
-        String certUri = "EncCertId-" + remoteCert.hashCode();
+        String certUri = UUIDGenerator.getUUID();
         Cipher cipher = WSSecurityUtil.getCipherInstance(keyEncAlgo);
         try {
             cipher.init(Cipher.ENCRYPT_MODE, remoteCert.getPublicKey());
@@ -230,7 +231,7 @@
          */
         encryptedKeyElement = createEnrcyptedKey(document, keyEncAlgo);
         if(this.encKeyId == null || "".equals(this.encKeyId)) {
-            this.encKeyId = "EncKeyId-" + encryptedKeyElement.hashCode();
+            this.encKeyId = "EncKeyId-" + UUIDGenerator.getUUID();
         }
         encryptedKeyElement.setAttributeNS(null, "Id", this.encKeyId);
 
@@ -489,6 +490,10 @@
      */
     public void setEncKeyId(String encKeyId) {
         this.encKeyId = encKeyId;
+    }
+    
+    public boolean isCertSet() {
+    	return (useThisCert == null ? true : false) ;
     }
     
     

Modified: webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecSignature.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecSignature.java?rev=588559&r1=588558&r2=588559&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecSignature.java (original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecSignature.java Fri Oct 26 01:40:09 2007
@@ -287,7 +287,8 @@
 		 */
 		X509Certificate[] certs = null;
 		if (keyIdentifierType != WSConstants.UT_SIGNING
-                && keyIdentifierType != WSConstants.CUSTOM_SYMM_SIGNING) {
+                && keyIdentifierType != WSConstants.CUSTOM_SYMM_SIGNING
+                  && keyIdentifierType != WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER) {
 			certs = crypto.getCertificates(user);
 			if (certs == null || certs.length <= 0) {
 				throw new WSSecurityException(WSSecurityException.FAILURE,
@@ -413,6 +414,10 @@
 		case WSConstants.THUMBPRINT_IDENTIFIER:
 			secRef.setKeyIdentifierThumb(certs[0]);
 			break;
+			
+		case WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER:
+			secRef.setKeyIdentifierEncKeySHA1(this.secretKey);
+			break;
 
 		case WSConstants.CUSTOM_SYMM_SIGNING :
             Reference refCust = new Reference(document);
@@ -665,7 +670,8 @@
 		WSDocInfoStore.store(wsDocInfo);
 		try {
 			if (keyIdentifierType == WSConstants.UT_SIGNING ||
-			        keyIdentifierType == WSConstants.CUSTOM_SYMM_SIGNING) {
+			        keyIdentifierType == WSConstants.CUSTOM_SYMM_SIGNING ||
+			          keyIdentifierType == WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER) {
 				sig.sign(sig.createSecretKey(secretKey));
 			} else {
 				sig.sign(crypto.getPrivateKey(user, password));

Modified: webservices/wss4j/trunk/src/org/apache/ws/security/message/token/SecurityTokenReference.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/message/token/SecurityTokenReference.java?rev=588559&r1=588558&r2=588559&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/message/token/SecurityTokenReference.java (original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/message/token/SecurityTokenReference.java Fri Oct 26 01:40:09 2007
@@ -56,6 +56,7 @@
     public static final String SKI_URI = WSConstants.X509TOKEN_NS + "#X509SubjectKeyIdentifier";
     public static final String THUMB_URI = WSConstants.SOAPMESSAGE_NS11 + "#" + WSConstants.THUMBPRINT;
     public static final String SAML_ID_URI = WSConstants.SAMLTOKEN_NS + "#" + WSConstants.SAML_ASSERTION_ID;
+    public static final String ENC_KEY_SHA1_URI = WSConstants.SOAPMESSAGE_NS11 + "#" + WSConstants.ENC_KEY_SHA1_URI;
     protected Element element = null;
     private XMLX509IssuerSerial issuerSerial = null;
     private byte[] skiBytes = null;
@@ -201,13 +202,14 @@
             }
             tokElement = sa;
         } else {
-            
+
             tokElement = WSSecurityUtil.getElementByWsuId(doc, uri);
             
             // In some scenarios id is used rather than wsu:Id
             if (tokElement == null) {
-                tokElement = WSSecurityUtil.getElementByGenId(doc, uri);
+            	tokElement = WSSecurityUtil.getElementByGenId(doc, uri);
             }
+
         }
         if (tokElement == null) {
             throw new WSSecurityException(WSSecurityException.SECURITY_TOKEN_UNAVAILABLE,
@@ -296,6 +298,25 @@
         createKeyIdentifier(doc, THUMB_URI, text);
     }
     
+
+    public void setKeyIdentifierEncKeySHA1(byte[] secret) 
+               throws WSSecurityException {
+        Document doc = this.element.getOwnerDocument();
+        MessageDigest sha = null;
+        try {
+            sha = MessageDigest.getInstance("SHA-1");
+        } catch (NoSuchAlgorithmException e1) {
+            throw new WSSecurityException(0, "noSHA1availabe");
+        }
+        sha.reset();
+        sha.update(secret);
+        byte[] data = sha.digest();
+        
+        org.w3c.dom.Text text = doc.createTextNode(Base64.encode(data));
+        createKeyIdentifier(doc, ENC_KEY_SHA1_URI, text);
+        
+    }
+    
     public void setSAMLKeyIdentifier(String keyIdVal)
             throws WSSecurityException {
         Document doc = this.element.getOwnerDocument();
@@ -318,6 +339,7 @@
             this.element.appendChild(keyId);
         }
     }
+
     /*
      * Several helper and utility methods.
      */

Modified: webservices/wss4j/trunk/src/org/apache/ws/security/processor/DerivedKeyTokenProcessor.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/processor/DerivedKeyTokenProcessor.java?rev=588559&r1=588558&r2=588559&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/processor/DerivedKeyTokenProcessor.java (original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/processor/DerivedKeyTokenProcessor.java Fri Oct 26 01:40:09 2007
@@ -33,6 +33,8 @@
 import org.apache.ws.security.util.Base64;
 import org.w3c.dom.Element;
 
+import sun.security.x509.KeyIdentifier;
+
 import javax.security.auth.callback.Callback;
 import javax.security.auth.callback.CallbackHandler;
 import javax.security.auth.callback.UnsupportedCallbackException;
@@ -118,6 +120,9 @@
         if (str != null) {
             Processor processor;
             String uri = null;
+            String keyIdentifierValueType = null;
+            String keyIdentifierValue = null;
+            
             if(str.containsReference()) {
                 Reference ref = str.getReference();
                 
@@ -125,13 +130,17 @@
                 processor = wsDocInfo.getProcessor(uri.substring(1));
             } else {
                 //Contains key identifier
-                String keyIdentifier = str.getKeyIdentifierValue();
-                processor = wsDocInfo.getProcessor(keyIdentifier);
+                keyIdentifierValue = str.getKeyIdentifierValue();
+                keyIdentifierValueType = str.getKeyIdentifierValueType();
+                processor = wsDocInfo.getProcessor(keyIdentifierValue);
             }
             
             if(processor == null && uri != null) {
                 //Now use the callback and get it
                 this.secret = this.getSecret(cb, uri.substring(1));
+            } else if (processor == null && keyIdentifierValue != null
+            		&& keyIdentifierValueType != null) {            	
+            	this.secret = this.getSecret(cb, keyIdentifierValue, keyIdentifierValueType); 
             } else if (processor instanceof EncryptedKeyProcessor) {
                 this.secret = ((EncryptedKeyProcessor) processor)
                         .getDecryptedBytes();
@@ -177,6 +186,36 @@
         }
 
         return callback.getKey();
+    }
+    
+    private byte[] getSecret(CallbackHandler cb, String keyIdentifierValue, String keyIdentifierType) 
+                                                             throws WSSecurityException {
+    	
+        if (cb == null) {
+            throw new WSSecurityException(WSSecurityException.FAILURE,
+                    "noCallback");
+        }
+        
+        WSPasswordCallback pwcb = null;
+    	
+        //Handle the EncryptedKeySHA1 type key references
+    	if (keyIdentifierType.equals
+    			(SecurityTokenReference.ENC_KEY_SHA1_URI)) {
+
+            pwcb = new WSPasswordCallback(keyIdentifierValue,
+                                               WSPasswordCallback.ENCRYPTED_KEY_TOKEN);
+            try {
+            	cb.handle(new Callback[]{pwcb});
+            } catch (IOException e) {
+                throw new WSSecurityException(WSSecurityException.FAILURE, "noKey",
+                        new Object[] { id });
+            } catch (UnsupportedCallbackException e) {
+                throw new WSSecurityException(WSSecurityException.FAILURE, "noKey",
+                        new Object[] { id });
+            }
+            
+        }
+    	return pwcb.getKey();
     }
     
     /**

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=588559&r1=588558&r2=588559&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 Oct 26 01:40:09 2007
@@ -47,6 +47,8 @@
 import javax.security.auth.callback.UnsupportedCallbackException;
 import javax.xml.namespace.QName;
 import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 import java.security.PrivateKey;
 import java.security.cert.X509Certificate;
 import java.util.ArrayList;
@@ -319,6 +321,7 @@
                 "ReferenceList", WSConstants.ENC_NS);
         ArrayList dataRefUris = new ArrayList();
         if (refList != null) {
+        	       	
             for (tmpE = refList.getFirstChild();
                  tmpE != null; tmpE = tmpE.getNextSibling()) {
                 if (tmpE.getNodeType() != Node.ELEMENT_NODE) {
@@ -519,4 +522,5 @@
     public byte[] getDecryptedBytes() {
         return decryptedBytes;
     }
+  
 }

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=588559&r1=588558&r2=588559&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 Oct 26 01:40:09 2007
@@ -103,6 +103,7 @@
                 dataRefUris.add(dataRefURI.substring(1));
 			}
 		}
+		
         return dataRefUris;
 	}
 
@@ -148,7 +149,7 @@
 		if (secRefToken == null) {
 			symmetricKey = X509Util.getSharedKey(tmpE, symEncAlgo, cb);
 		} else
-			symmetricKey = getKeyFromReference(secRefToken, symEncAlgo, crypto, cb);
+			symmetricKey = getKeyFromSecurityTokenReference(secRefToken, symEncAlgo, crypto, cb);
 
 		// initialize Cipher ....
 		XMLCipher xmlCipher = null;
@@ -163,8 +164,22 @@
 		if (content) {
 			encBodyData = (Element) encBodyData.getParentNode();
 		}
+			
 		try {
+			Node parentEncBody =encBodyData.getParentNode();
+			
 			xmlCipher.doFinal(doc, encBodyData, content);
+			
+			if(parentEncBody.getLocalName().equals(WSConstants.ENCRYPTED_HEADER)
+					&& parentEncBody.getNamespaceURI().equals(WSConstants.WSSE11_NS)) {
+				Node decryptedHeader = parentEncBody.getFirstChild();
+				Node decryptedHeaderClone = decryptedHeader.cloneNode(true);
+				Node encryptedHeader = decryptedHeader.getParentNode();
+				parentEncBody.getParentNode().appendChild(decryptedHeaderClone);
+				parentEncBody.getParentNode().removeChild(parentEncBody);
+				
+			}
+			
 		} catch (Exception e) {
 			throw new WSSecurityException(WSSecurityException.FAILED_ENC_DEC,
 					null, null, e);
@@ -207,7 +222,7 @@
 	 * @return The secret key for the specified algorithm
 	 * @throws WSSecurityException
 	 */
-	private SecretKey getKeyFromReference(Element secRefToken, String algorithm,
+	private SecretKey getKeyFromSecurityTokenReference(Element secRefToken, String algorithm,
 	        Crypto crypto, CallbackHandler cb)
 			throws WSSecurityException {
 
@@ -253,7 +268,24 @@
                 //secret in them
                 decryptedData = keyInfo.getSecret();
             }
-		} else {
+		} else if (secRef.containsKeyIdentifier()){
+			
+			if ( secRef.getKeyIdentifierValueType().equals(SecurityTokenReference.ENC_KEY_SHA1_URI)) {
+			    
+				String sha = secRef.getKeyIdentifierValue();
+				
+				WSPasswordCallback pwcb = new WSPasswordCallback(sha, WSPasswordCallback.ENCRYPTED_KEY_TOKEN);
+			    
+				try {
+                    cb.handle(new Callback[]{pwcb});
+                } catch (Exception e) {
+                    throw new WSSecurityException(WSSecurityException.FAILURE,
+                            "noPassword", new Object[] { sha });
+                }
+			    decryptedData = pwcb.getKey();
+			}
+		
+	    }else {
 			throw new WSSecurityException(WSSecurityException.FAILED_ENC_DEC,
 					"noReference");
 		}

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=588559&r1=588558&r2=588559&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 Oct 26 01:40:09 2007
@@ -232,9 +232,9 @@
                     } else if (el.equals(WSSecurityEngine.SAML_TOKEN)) {
                         samlKi = SAMLUtil.getSAMLKeyInfo(
                                 (Element) token, crypto, cb);
-                        
                         certs = samlKi.getCerts();
                         secretKey = samlKi.getSecret();
+
                     } else if (el.equals(WSSecurityEngine.ENCRYPTED_KEY)){
                         EncryptedKeyProcessor encryptKeyProcessor = new EncryptedKeyProcessor();
                         encryptKeyProcessor.handleEncryptedKey((Element)token, cb, crypto);
@@ -269,7 +269,24 @@
             } else if (secRef.containsX509Data() || secRef.containsX509IssuerSerial()) {
                 certs = secRef.getX509IssuerSerial(crypto);
             } else if (secRef.containsKeyIdentifier()) {
-                certs = secRef.getKeyIdentifier(crypto);
+            	if (secRef.getKeyIdentifierValueType().equals
+            			(SecurityTokenReference.ENC_KEY_SHA1_URI)) {
+                    
+            		String id = secRef.getKeyIdentifierValue();
+                    WSPasswordCallback pwcb = new WSPasswordCallback(id,
+                                                       WSPasswordCallback.ENCRYPTED_KEY_TOKEN);
+                    try {
+                    	cb.handle(new Callback[]{pwcb});
+		            } catch (Exception e) {
+		                throw new WSSecurityException(WSSecurityException.FAILURE,
+		                        "noPassword", new Object[] { id });
+		            }
+            
+		            secretKey = pwcb.getKey();
+		            
+            	} else {
+            		certs = secRef.getKeyIdentifier(crypto);
+            	}
             } else {
                 throw new WSSecurityException(
                         WSSecurityException.INVALID_SECURITY,

Modified: webservices/wss4j/trunk/test/wssec/TestWSSecurityNew10.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/test/wssec/TestWSSecurityNew10.java?rev=588559&r1=588558&r2=588559&view=diff
==============================================================================
--- webservices/wss4j/trunk/test/wssec/TestWSSecurityNew10.java (original)
+++ webservices/wss4j/trunk/test/wssec/TestWSSecurityNew10.java Fri Oct 26 01:40:09 2007
@@ -181,6 +181,7 @@
         wsEncrypt.setSecurityTokenReference(secRef);
         wsEncrypt.setKey(key);
         wsEncrypt.setSymmetricEncAlgorithm(WSConstants.TRIPLE_DES);
+        wsEncrypt.setDocument(doc);
 
         // Step 4 :: Encrypting using the key.
         Document encDoc = wsEncrypt.build(doc, crypto, secHeader);

Modified: webservices/wss4j/trunk/test/wssec/TestWSSecurityNew9.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/test/wssec/TestWSSecurityNew9.java?rev=588559&r1=588558&r2=588559&view=diff
==============================================================================
--- webservices/wss4j/trunk/test/wssec/TestWSSecurityNew9.java (original)
+++ webservices/wss4j/trunk/test/wssec/TestWSSecurityNew9.java Fri Oct 26 01:40:09 2007
@@ -161,6 +161,7 @@
         sign.setUserInfo("16c73ab6-b892-458f-abf5-2f875f74882e", "security");
         log.info("Before Encryption....");
         Document doc = unsignedEnvelope.getAsDocument();
+        encrypt.setDocument(doc);
         WSSecHeader secHeader = new WSSecHeader();
         secHeader.insertSecurityHeader(doc);                
         Document signedDoc = sign.build(doc, crypto, secHeader);



---------------------------------------------------------------------
To unsubscribe, e-mail: wss4j-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: wss4j-dev-help@ws.apache.org