Author: coheigea
Date: Wed Aug 17 12:34:18 2011
New Revision: 1158656

URL: http://svn.apache.org/viewvc?rev=1158656&view=rev
Log:
[WSS-307] - Store the secret key in KerberosSecurity + added some tests to use 
it for signature and encryption creation
 - Verification/Decryption is not working yet.

Modified:
    
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/token/KerberosSecurity.java
    
webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/token/KerberosTest.java

Modified: 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/token/KerberosSecurity.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/token/KerberosSecurity.java?rev=1158656&r1=1158655&r2=1158656&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/token/KerberosSecurity.java
 (original)
+++ 
webservices/wss4j/trunk/src/main/java/org/apache/ws/security/message/token/KerberosSecurity.java
 Wed Aug 17 12:34:18 2011
@@ -22,8 +22,10 @@ package org.apache.ws.security.message.t
 import java.security.Principal;
 import java.util.Set;
 
+import javax.crypto.SecretKey;
 import javax.security.auth.Subject;
 import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.kerberos.KerberosTicket;
 import javax.security.auth.login.LoginContext;
 import javax.security.auth.login.LoginException;
 
@@ -39,6 +41,7 @@ public class KerberosSecurity extends Bi
     
     private static org.apache.commons.logging.Log log =
         org.apache.commons.logging.LogFactory.getLog(KerberosSecurity.class);
+    private SecretKey secretKey;
     
     /**
      * This constructor creates a new Kerberos token object and initializes
@@ -151,6 +154,8 @@ public class KerberosSecurity extends Bi
                 new Object[] {"No Client principals found after login"}
             );
         }
+        // Store the TGT
+        KerberosTicket tgt = getKerberosTicket(clientSubject, null);
         
         // Get the service ticket
         KerberosClientAction action = 
@@ -165,6 +170,12 @@ public class KerberosSecurity extends Bi
             log.debug("Successfully retrieved a service ticket");
         }
         
+        // Get the Service Ticket (private credential)
+        KerberosTicket serviceTicket = getKerberosTicket(clientSubject, tgt);
+        if (serviceTicket != null) {
+            secretKey = serviceTicket.getSessionKey();
+        }
+        
         setToken(ticket);
         
         if ("".equals(getValueType())) {
@@ -173,6 +184,35 @@ public class KerberosSecurity extends Bi
     }
     
     /**
+     * Get a KerberosTicket from the clientSubject parameter, that is not 
equal to the supplied KerberosTicket
+     * parameter (can be null)
+     */
+    private KerberosTicket getKerberosTicket(Subject clientSubject, 
KerberosTicket previousTicket) {
+        Set<KerberosTicket> privateCredentials = 
clientSubject.getPrivateCredentials(KerberosTicket.class);
+        if (privateCredentials == null || privateCredentials.isEmpty()) {
+            if (log.isDebugEnabled()) {
+                log.debug("Kerberos client subject private credentials are 
null");
+            }
+            return null;
+        }
+        
+        for (KerberosTicket privateCredential : privateCredentials) {
+            if (!privateCredential.equals(previousTicket)) {
+                return privateCredential;
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * Get the SecretKey associated with the service principal
+     * @return the SecretKey associated with the service principal
+     */
+    public SecretKey getSecretKey() {
+        return secretKey;
+    }
+    
+    /**
      * Return true if the valueType represents a Kerberos Token
      * @param valueType the valueType of the token
      * @return true if the valueType represents a Kerberos Token

Modified: 
webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/token/KerberosTest.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/token/KerberosTest.java?rev=1158656&r1=1158655&r2=1158656&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/token/KerberosTest.java
 (original)
+++ 
webservices/wss4j/trunk/src/test/java/org/apache/ws/security/message/token/KerberosTest.java
 Wed Aug 17 12:34:18 2011
@@ -25,7 +25,10 @@ import org.apache.ws.security.WSConstant
 import org.apache.ws.security.WSSecurityEngineResult;
 import org.apache.ws.security.WSSecurityException;
 import org.apache.ws.security.common.SOAPUtil;
+import org.apache.ws.security.message.WSSecEncrypt;
 import org.apache.ws.security.message.WSSecHeader;
+import org.apache.ws.security.message.WSSecSignature;
+import org.apache.ws.security.util.Base64;
 import org.apache.ws.security.util.WSSecurityUtil;
 import org.apache.ws.security.validate.KerberosTokenValidator;
 import org.w3c.dom.Document;
@@ -33,7 +36,9 @@ import org.w3c.dom.Document;
 import java.security.Principal;
 import java.util.List;
 
+import javax.crypto.SecretKey;
 import javax.security.auth.kerberos.KerberosPrincipal;
+import javax.xml.crypto.dsig.SignatureMethod;
 
 /**
  * This is a test for a WSS4J client retrieving a service ticket from a KDC, 
and inserting
@@ -126,5 +131,98 @@ public class KerberosTest extends org.ju
         
     }
     
+    /**
+     * Test using the KerberosSecurity class to retrieve a service ticket from 
a KDC, wrap it
+     * in a BinarySecurityToken, and use the session key to sign the SOAP Body.
+     */
+    @org.junit.Test
+    @org.junit.Ignore
+    public void testKerberosSignature() throws Exception {
+        Document doc = SOAPUtil.toSOAPPart(SOAPUtil.SAMPLE_SOAP_MSG);
+
+        WSSecHeader secHeader = new WSSecHeader();
+        secHeader.insertSecurityHeader(doc);
+        
+        KerberosSecurity bst = new KerberosSecurity(doc);
+        bst.retrieveServiceTicket("alice", null, "[email protected]");
+        WSSecurityUtil.prependChildElement(secHeader.getSecurityHeader(), 
bst.getElement());
+        
+        WSSecSignature sign = new WSSecSignature();
+        sign.setSignatureAlgorithm(SignatureMethod.HMAC_SHA1);
+        sign.setKeyIdentifierType(WSConstants.CUSTOM_KEY_IDENTIFIER);
+        sign.setCustomTokenValueType(WSConstants.WSS_KRB_KI_VALUE_TYPE);
+        
+        SecretKey secretKey = bst.getSecretKey();
+        byte[] digestBytes = 
WSSecurityUtil.generateDigest(secretKey.getEncoded());
+        sign.setCustomTokenId(Base64.encode(digestBytes));
+        sign.setSecretKey(secretKey.getEncoded());
+        
+        Document signedDoc = sign.build(doc, null, secHeader);
+        
+        if (LOG.isDebugEnabled()) {
+            String outputString = 
+                
org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(signedDoc);
+            LOG.debug(outputString);
+        }
+        
+        /*
+        // Configure the Validator
+        WSSConfig wssConfig = WSSConfig.getNewInstance();
+        KerberosTokenValidator validator = new KerberosTokenValidator();
+        validator.setJaasLoginModuleName("bob");
+        validator.setServiceName("[email protected]");
+        wssConfig.setValidator(WSSecurityEngine.BINARY_TOKEN, validator);
+        WSSecurityEngine secEngine = new WSSecurityEngine();
+        secEngine.setWssConfig(wssConfig);
+        
+        List<WSSecurityEngineResult> results = 
+            secEngine.processSecurityHeader(doc, null, null, null);
+        WSSecurityEngineResult actionResult =
+            WSSecurityUtil.fetchActionResult(results, WSConstants.BST);
+        BinarySecurity token =
+            
(BinarySecurity)actionResult.get(WSSecurityEngineResult.TAG_BINARY_SECURITY_TOKEN);
+        assertTrue(token != null);
+        
+        Principal principal = 
(Principal)actionResult.get(WSSecurityEngineResult.TAG_PRINCIPAL);
+        assertTrue(principal instanceof KerberosPrincipal);
+        assertTrue(principal.getName().contains("alice"));
+        */
+    }
+    
+    /**
+     * Test using the KerberosSecurity class to retrieve a service ticket from 
a KDC, wrap it
+     * in a BinarySecurityToken, and use the session key to encrypt the SOAP 
Body.
+     */
+    @org.junit.Test
+    @org.junit.Ignore
+    public void testKerberosEncryption() throws Exception {
+        Document doc = SOAPUtil.toSOAPPart(SOAPUtil.SAMPLE_SOAP_MSG);
+
+        WSSecHeader secHeader = new WSSecHeader();
+        secHeader.insertSecurityHeader(doc);
+        
+        KerberosSecurity bst = new KerberosSecurity(doc);
+        bst.retrieveServiceTicket("alice", null, "[email protected]");
+        bst.setID("Id-" + bst.hashCode());
+        WSSecurityUtil.prependChildElement(secHeader.getSecurityHeader(), 
bst.getElement());
+        
+        WSSecEncrypt builder = new WSSecEncrypt();
+        builder.setSymmetricEncAlgorithm(WSConstants.AES_128);
+        SecretKey secretKey = bst.getSecretKey();
+        builder.setSymmetricKey(secretKey);
+        builder.setEncryptSymmKey(false);
+        builder.setCustomReferenceValue(WSConstants.WSS_GSS_KRB_V5_AP_REQ);
+        builder.setEncKeyId(bst.getID());
+
+        Document encryptedDoc = builder.build(doc, null, secHeader);
+        
+        if (LOG.isDebugEnabled()) {
+            String outputString = 
+                
org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(encryptedDoc);
+            LOG.debug(outputString);
+        }
+    
+    }
+    
     
 }


Reply via email to