Author: coheigea
Date: Mon Mar  7 11:57:46 2011
New Revision: 1078756

URL: http://svn.apache.org/viewvc?rev=1078756&view=rev
Log:
[WSS-256] - BSP compliance work for EncryptedKeys.

Modified:
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecDerivedKeyBase.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecEncrypt.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecEncryptedKey.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecSignature.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/DerivedKeyTokenSTRParser.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/SecurityTokenRefSTRParser.java
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/SignatureSTRParser.java
    
webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/SignatureEncryptionTest.java
    
webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/SymmetricSignatureTest.java

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecDerivedKeyBase.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecDerivedKeyBase.java?rev=1078756&r1=1078755&r2=1078756&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecDerivedKeyBase.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecDerivedKeyBase.java
 Mon Mar  7 11:57:46 2011
@@ -19,6 +19,7 @@
 
 package org.apache.ws.security.message;
 
+import org.apache.ws.security.WSConstants;
 import org.apache.ws.security.WSSecurityException;
 import org.apache.ws.security.conversation.ConversationConstants;
 import org.apache.ws.security.conversation.ConversationException;
@@ -220,9 +221,12 @@ public abstract class WSSecDerivedKeyBas
             } else {
                 ref.setURI("#" + tokenIdentifier);
             }
-            if (customValueType != null && customValueType.trim().length() > 
0) {
+            if (customValueType != null && !"".equals(customValueType)) {
                 ref.setValueType(customValueType);
             }
+            if 
(!WSConstants.WSS_USERNAME_TOKEN_VALUE_TYPE.equals(customValueType)) {
+                strEncKey.addTokenType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
+            }
             strEncKey.setReference(ref);
             dkt.setSecurityTokenReference(strEncKey); 
         } else {

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecEncrypt.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecEncrypt.java?rev=1078756&r1=1078755&r2=1078756&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecEncrypt.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecEncrypt.java
 Mon Mar  7 11:57:46 2011
@@ -544,6 +544,7 @@ public class WSSecEncrypt extends WSSecE
                 byte[] encodedBytes = 
WSSecurityUtil.generateDigest(encryptedEphemeralKey);
                 
secToken.setKeyIdentifierEncKeySHA1(Base64.encode(encodedBytes));
             }
+            secToken.addTokenType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
             keyInfo.addUnknownElement(secToken.getElement());
         } else if (keyIdentifierType == WSConstants.EMBEDDED_KEYNAME) {
             keyInfo.addKeyName(embeddedKeyName == null ? user : 
embeddedKeyName);
@@ -580,6 +581,7 @@ public class WSSecEncrypt extends WSSecE
                 ref.setValueType(customReferenceValue);
             }
             secToken.setReference(ref);
+            secToken.addTokenType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
             keyInfo.addUnknownElement(secToken.getElement());
         }
         Element keyInfoElement = keyInfo.getElement();

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecEncryptedKey.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecEncryptedKey.java?rev=1078756&r1=1078755&r2=1078756&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecEncryptedKey.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecEncryptedKey.java
 Mon Mar  7 11:57:46 2011
@@ -309,6 +309,9 @@ public class WSSecEncryptedKey extends W
                 refCust.setValueType(customEKTokenValueType);
             } else if 
(WSConstants.WSS_SAML2_KI_VALUE_TYPE.equals(customEKTokenValueType)) {
                 secToken.addTokenType(WSConstants.WSS_SAML2_TOKEN_TYPE);
+            } else if 
(WSConstants.WSS_ENC_KEY_VALUE_TYPE.equals(customEKTokenValueType)) {
+                secToken.addTokenType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
+                refCust.setValueType(customEKTokenValueType);
             } else {
                 refCust.setValueType(customEKTokenValueType);
             }
@@ -323,6 +326,9 @@ public class WSSecEncryptedKey extends W
                 refCustd.setValueType(customEKTokenValueType);
             } else if 
(WSConstants.WSS_SAML2_KI_VALUE_TYPE.equals(customEKTokenValueType)) {
                 secToken.addTokenType(WSConstants.WSS_SAML2_TOKEN_TYPE);
+            }  else if 
(WSConstants.WSS_ENC_KEY_VALUE_TYPE.equals(customEKTokenValueType)) {
+                secToken.addTokenType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
+                refCustd.setValueType(customEKTokenValueType);
             } else {
                 refCustd.setValueType(customEKTokenValueType);
             }
@@ -336,6 +342,10 @@ public class WSSecEncryptedKey extends W
                 secToken.addTokenType(WSConstants.WSS_SAML_TOKEN_TYPE);
             } else if 
(WSConstants.WSS_SAML2_KI_VALUE_TYPE.equals(customEKTokenValueType)) {
                 secToken.addTokenType(WSConstants.WSS_SAML2_TOKEN_TYPE);
+            } else if 
(WSConstants.WSS_ENC_KEY_VALUE_TYPE.equals(customEKTokenValueType)) {
+                secToken.addTokenType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
+            } else if 
(SecurityTokenReference.ENC_KEY_SHA1_URI.equals(customEKTokenValueType)) {
+                secToken.addTokenType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
             }
             break;           
 

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecSignature.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecSignature.java?rev=1078756&r1=1078755&r2=1078756&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecSignature.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/WSSecSignature.java
 Mon Mar  7 11:57:46 2011
@@ -214,6 +214,7 @@ public class WSSecSignature extends WSSe
                 byte[] digestBytes = WSSecurityUtil.generateDigest(secretKey);
                 secRef.setKeyIdentifierEncKeySHA1(Base64.encode(digestBytes));
             }
+            secRef.addTokenType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
             break;
 
         case WSConstants.CUSTOM_SYMM_SIGNING :
@@ -223,6 +224,9 @@ public class WSSecSignature extends WSSe
                 refCust.setValueType(customTokenValueType);
             } else if 
(WSConstants.WSS_SAML2_KI_VALUE_TYPE.equals(customTokenValueType)) {
                 secRef.addTokenType(WSConstants.WSS_SAML2_TOKEN_TYPE);
+            } else if 
(WSConstants.WSS_ENC_KEY_VALUE_TYPE.equals(customTokenValueType)) {
+                secRef.addTokenType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
+                refCust.setValueType(customTokenValueType);
             } else {
                 refCust.setValueType(customTokenValueType);
             }
@@ -237,6 +241,9 @@ public class WSSecSignature extends WSSe
                 refCustd.setValueType(customTokenValueType);
             } else if 
(WSConstants.WSS_SAML2_KI_VALUE_TYPE.equals(customTokenValueType)) {
                 secRef.addTokenType(WSConstants.WSS_SAML2_TOKEN_TYPE);
+            } else if 
(WSConstants.WSS_ENC_KEY_VALUE_TYPE.equals(customTokenValueType)) {
+                secRef.addTokenType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
+                refCustd.setValueType(customTokenValueType);
             } else {
                 refCustd.setValueType(customTokenValueType);
             }
@@ -250,6 +257,10 @@ public class WSSecSignature extends WSSe
                 secRef.addTokenType(WSConstants.WSS_SAML_TOKEN_TYPE);
             } else if 
(WSConstants.WSS_SAML2_KI_VALUE_TYPE.equals(customTokenValueType)) {
                 secRef.addTokenType(WSConstants.WSS_SAML2_TOKEN_TYPE);
+            } else if 
(WSConstants.WSS_ENC_KEY_VALUE_TYPE.equals(customTokenValueType)) {
+                secRef.addTokenType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
+            } else if 
(SecurityTokenReference.ENC_KEY_SHA1_URI.equals(customTokenValueType)) {
+                secRef.addTokenType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
             }
             break;
             

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/DerivedKeyTokenSTRParser.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/DerivedKeyTokenSTRParser.java?rev=1078756&r1=1078755&r2=1078756&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/DerivedKeyTokenSTRParser.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/DerivedKeyTokenSTRParser.java
 Mon Mar  7 11:57:46 2011
@@ -106,6 +106,9 @@ public class DerivedKeyTokenSTRParser im
                 usernameToken.setRawPassword(cb);
                 secretKey = usernameToken.getDerivedKey();
             } else if (WSConstants.ENCR == action) {
+                if (bspCompliant) {
+                    checkEncryptedKeyBSPCompliance(secRef);
+                }
                 secretKey = 
(byte[])result.get(WSSecurityEngineResult.TAG_SECRET);
             } else if (WSConstants.SCT == action) {
                 secretKey = 
(byte[])result.get(WSSecurityEngineResult.TAG_SECRET);
@@ -127,6 +130,10 @@ public class DerivedKeyTokenSTRParser im
             secretKey = 
                 getSecretKeyFromToken(uri, null, 
WSPasswordCallback.SECURITY_CONTEXT_TOKEN, cb);
         } else if (keyIdentifierValue != null && keyIdentifierValueType != 
null) {
+            if (bspCompliant 
+                && 
keyIdentifierValueType.equals(SecurityTokenReference.ENC_KEY_SHA1_URI)) {
+                checkEncryptedKeyBSPCompliance(secRef);
+            }
             X509Certificate[] certs = secRef.getKeyIdentifier(crypto);
             if (certs == null || certs.length < 1 || certs[0] == null) {
                 secretKey = 
@@ -234,4 +241,34 @@ public class DerivedKeyTokenSTRParser im
         return pwcb.getKey();
     }
     
+    /**
+     * Check that the EncryptedKey referenced by the SecurityTokenReference 
argument 
+     * is BSP compliant.
+     * @param secRef The SecurityTokenReference to the BinarySecurityToken
+     * @throws WSSecurityException
+     */
+    private static void checkEncryptedKeyBSPCompliance(
+        SecurityTokenReference secRef
+    ) throws WSSecurityException {
+        if (secRef.containsKeyIdentifier()) {
+            String valueType = secRef.getKeyIdentifierValueType();
+            if (!SecurityTokenReference.ENC_KEY_SHA1_URI.equals(valueType)) {
+                throw new WSSecurityException(
+                    WSSecurityException.INVALID_SECURITY_TOKEN, 
+                    "invalidValueType", 
+                    new Object[]{valueType}
+                );
+            }
+        }
+        
+        String tokenType = secRef.getTokenType();
+        if (!WSConstants.WSS_ENC_KEY_VALUE_TYPE.equals(tokenType)) {
+            throw new WSSecurityException(
+                WSSecurityException.INVALID_SECURITY_TOKEN, 
+                "invalidTokenType", 
+                 new Object[]{tokenType}
+            );
+        }
+    }
+    
 }

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/SecurityTokenRefSTRParser.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/SecurityTokenRefSTRParser.java?rev=1078756&r1=1078755&r2=1078756&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/SecurityTokenRefSTRParser.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/SecurityTokenRefSTRParser.java
 Mon Mar  7 11:57:46 2011
@@ -93,6 +93,9 @@ public class SecurityTokenRefSTRParser i
             if (result != null) {
                 int action = 
((Integer)result.get(WSSecurityEngineResult.TAG_ACTION)).intValue();
                 if (WSConstants.ENCR == action) {
+                    if (bspCompliant) {
+                        checkEncryptedKeyBSPCompliance(secRef);
+                    }
                     secretKey = 
(byte[])result.get(WSSecurityEngineResult.TAG_SECRET);
                 } else if (WSConstants.DKT == action) {
                     DerivedKeyToken dkt = 
@@ -122,8 +125,9 @@ public class SecurityTokenRefSTRParser i
                 }
             }
         } else if (secRef.containsKeyIdentifier()){
-            if 
(WSConstants.WSS_SAML_KI_VALUE_TYPE.equals(secRef.getKeyIdentifierValueType())
-                || 
WSConstants.WSS_SAML2_KI_VALUE_TYPE.equals(secRef.getKeyIdentifierValueType())) 
{ 
+            String valueType = secRef.getKeyIdentifierValueType();
+            if (WSConstants.WSS_SAML_KI_VALUE_TYPE.equals(valueType)
+                || WSConstants.WSS_SAML2_KI_VALUE_TYPE.equals(valueType)) { 
                 AssertionWrapper assertion = 
                     SAMLUtil.getAssertionFromKeyIdentifier(
                         secRef, strElement, crypto, cb, wsDocInfo, config
@@ -134,6 +138,9 @@ public class SecurityTokenRefSTRParser i
                 // secret in them
                 secretKey = samlKi.getSecret();
             } else {
+                if (bspCompliant && 
SecurityTokenReference.ENC_KEY_SHA1_URI.equals(valueType)) {
+                    checkEncryptedKeyBSPCompliance(secRef);
+                } 
                 secretKey = 
                     getSecretKeyFromToken(
                         secRef.getKeyIdentifierValue(), 
secRef.getKeyIdentifierValueType(), cb
@@ -209,4 +216,34 @@ public class SecurityTokenRefSTRParser i
         return pwcb.getKey();
     }
     
+    /**
+     * Check that the EncryptedKey referenced by the SecurityTokenReference 
argument 
+     * is BSP compliant.
+     * @param secRef The SecurityTokenReference to the BinarySecurityToken
+     * @throws WSSecurityException
+     */
+    private static void checkEncryptedKeyBSPCompliance(
+        SecurityTokenReference secRef
+    ) throws WSSecurityException {
+        if (secRef.containsKeyIdentifier()) {
+            String valueType = secRef.getKeyIdentifierValueType();
+            if (!SecurityTokenReference.ENC_KEY_SHA1_URI.equals(valueType)) {
+                throw new WSSecurityException(
+                    WSSecurityException.INVALID_SECURITY_TOKEN, 
+                    "invalidValueType", 
+                    new Object[]{valueType}
+                );
+            }
+        }
+        
+        String tokenType = secRef.getTokenType();
+        if (!WSConstants.WSS_ENC_KEY_VALUE_TYPE.equals(tokenType)) {
+            throw new WSSecurityException(
+                WSSecurityException.INVALID_SECURITY_TOKEN, 
+                "invalidTokenType", 
+                 new Object[]{tokenType}
+            );
+        }
+    }
+    
 }

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/SignatureSTRParser.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/SignatureSTRParser.java?rev=1078756&r1=1078755&r2=1078756&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/SignatureSTRParser.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/str/SignatureSTRParser.java
 Mon Mar  7 11:57:46 2011
@@ -151,6 +151,9 @@ public class SignatureSTRParser implemen
                     secretKey = keyInfo.getSecret();
                     principal = createPrincipalFromSAML(assertion);
                 } else if (el.equals(WSSecurityEngine.ENCRYPTED_KEY)) {
+                    if (bspCompliant) {
+                        checkEncryptedKeyBSPCompliance(secRef);
+                    }
                     Processor proc = 
config.getProcessor(WSSecurityEngine.ENCRYPTED_KEY);
                     List<WSSecurityEngineResult> encrResult =
                         proc.handleToken(token, null, crypto, cb, wsDocInfo, 
config);
@@ -198,6 +201,9 @@ public class SignatureSTRParser implemen
                     certs = 
                         
(X509Certificate[])result.get(WSSecurityEngineResult.TAG_X509_CERTIFICATES);
                 } else if (WSConstants.ENCR == action) {
+                    if (bspCompliant) {
+                        checkEncryptedKeyBSPCompliance(secRef);
+                    }
                     secretKey = 
(byte[])result.get(WSSecurityEngineResult.TAG_SECRET);
                     String id = 
(String)result.get(WSSecurityEngineResult.TAG_ID);
                     principal = new CustomTokenPrincipal(id);
@@ -240,6 +246,9 @@ public class SignatureSTRParser implemen
             }
         } else if (secRef.containsKeyIdentifier()) {
             if 
(secRef.getKeyIdentifierValueType().equals(SecurityTokenReference.ENC_KEY_SHA1_URI))
 {
+                if (bspCompliant) {
+                    checkEncryptedKeyBSPCompliance(secRef);
+                }
                 String id = secRef.getKeyIdentifierValue();
                 secretKey = 
                     getSecretKeyFromToken(id, 
SecurityTokenReference.ENC_KEY_SHA1_URI, cb);
@@ -396,6 +405,36 @@ public class SignatureSTRParser implemen
             }
         }
     }
+    
+    /**
+     * Check that the EncryptedKey referenced by the SecurityTokenReference 
argument 
+     * is BSP compliant.
+     * @param secRef The SecurityTokenReference to the BinarySecurityToken
+     * @throws WSSecurityException
+     */
+    private static void checkEncryptedKeyBSPCompliance(
+        SecurityTokenReference secRef
+    ) throws WSSecurityException {
+        if (secRef.containsKeyIdentifier()) {
+            String valueType = secRef.getKeyIdentifierValueType();
+            if (!SecurityTokenReference.ENC_KEY_SHA1_URI.equals(valueType)) {
+                throw new WSSecurityException(
+                    WSSecurityException.INVALID_SECURITY_TOKEN, 
+                    "invalidValueType", 
+                    new Object[]{valueType}
+                );
+            }
+        }
+        
+        String tokenType = secRef.getTokenType();
+        if (!WSConstants.WSS_ENC_KEY_VALUE_TYPE.equals(tokenType)) {
+            throw new WSSecurityException(
+                WSSecurityException.INVALID_SECURITY_TOKEN, 
+                "invalidTokenType", 
+                 new Object[]{tokenType}
+            );
+        }
+    }
 
     /**
      * Checks the <code>element</code> and creates appropriate binary security 
object.

Modified: 
webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/SignatureEncryptionTest.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/SignatureEncryptionTest.java?rev=1078756&r1=1078755&r2=1078756&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/SignatureEncryptionTest.java
 (original)
+++ 
webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/SignatureEncryptionTest.java
 Mon Mar  7 11:57:46 2011
@@ -393,6 +393,7 @@ public class SignatureEncryptionTest ext
         sign.setKeyIdentifierType(WSConstants.CUSTOM_SYMM_SIGNING);
         sign.setCustomTokenId(encrKey.getId());
         sign.setSecretKey(encrKey.getEphemeralKey());
+        sign.setCustomTokenValueType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
         sign.setSignatureAlgorithm(SignatureMethod.HMAC_SHA1);
 
         Document signedDoc = sign.build(doc, crypto, secHeader);

Modified: 
webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/SymmetricSignatureTest.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/SymmetricSignatureTest.java?rev=1078756&r1=1078755&r2=1078756&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/SymmetricSignatureTest.java
 (original)
+++ 
webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/SymmetricSignatureTest.java
 Mon Mar  7 11:57:46 2011
@@ -132,9 +132,7 @@ public class SymmetricSignatureTest exte
         sign.setCustomTokenId(encrKey.getId());
         sign.setSecretKey(encrKey.getEphemeralKey());
         sign.setSignatureAlgorithm(SignatureMethod.HMAC_SHA1);
-        sign.setCustomTokenValueType(
-            WSConstants.SOAPMESSAGE_NS11 + "#" + WSConstants.ENC_KEY_VALUE_TYPE
-        );
+        sign.setCustomTokenValueType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
 
         Document signedDoc = sign.build(doc, crypto, secHeader);
         encrKey.prependToHeader(secHeader);
@@ -180,6 +178,7 @@ public class SymmetricSignatureTest exte
         WSSecSignature sign = new WSSecSignature();
         sign.setKeyIdentifierType(WSConstants.CUSTOM_SYMM_SIGNING);
         sign.setCustomTokenId(encrKey.getId());
+        sign.setCustomTokenValueType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);
         sign.setSecretKey(encrKey.getEphemeralKey());
         sign.setSignatureAlgorithm(SignatureMethod.HMAC_SHA1);
 


Reply via email to