Author: coheigea
Date: Mon Oct 14 14:56:32 2013
New Revision: 1531927

URL: http://svn.apache.org/r1531927
Log:
Add the ability to sign a SAML Assertion using the main signature

Modified:
    
webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenUnsignedAction.java
    
webservices/wss4j/trunk/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SAMLTokenOutputProcessor.java
    
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/PrincipalTest.java
    
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenNegativeTest.java
    
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenSVTest.java
    
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenTest.java

Modified: 
webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenUnsignedAction.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenUnsignedAction.java?rev=1531927&r1=1531926&r2=1531927&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenUnsignedAction.java
 (original)
+++ 
webservices/wss4j/trunk/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenUnsignedAction.java
 Mon Oct 14 14:56:32 2013
@@ -22,6 +22,7 @@ package org.apache.wss4j.dom.action;
 import javax.security.auth.callback.CallbackHandler;
 
 import org.apache.wss4j.common.SecurityActionToken;
+import org.apache.wss4j.common.crypto.Crypto;
 import org.apache.wss4j.common.ext.WSSecurityException;
 import org.apache.wss4j.common.saml.SamlAssertionWrapper;
 import org.apache.wss4j.common.saml.SAMLCallback;
@@ -55,6 +56,21 @@ public class SAMLTokenUnsignedAction imp
         SAMLUtil.doSAMLCallback(samlCallbackHandler, samlCallback);
 
         SamlAssertionWrapper samlAssertion = new 
SamlAssertionWrapper(samlCallback);
+        if (samlCallback.isSignAssertion()) {
+            Crypto signingCrypto = samlCallback.getIssuerCrypto();
+            if (signingCrypto == null) {
+                signingCrypto = handler.loadSignatureCrypto(reqData);
+            }
+            
+            samlAssertion.signAssertion(
+                samlCallback.getIssuerKeyName(),
+                samlCallback.getIssuerKeyPassword(), 
+                samlCallback.getIssuerCrypto(),
+                samlCallback.isSendKeyValue(),
+                samlCallback.getCanonicalizationAlgorithm(),
+                samlCallback.getSignatureAlgorithm()
+            );
+        }
 
         // add the SAMLAssertion Token to the SOAP Envelope
         builder.build(doc, samlAssertion, reqData.getSecHeader());

Modified: 
webservices/wss4j/trunk/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SAMLTokenOutputProcessor.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SAMLTokenOutputProcessor.java?rev=1531927&r1=1531926&r2=1531927&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SAMLTokenOutputProcessor.java
 (original)
+++ 
webservices/wss4j/trunk/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SAMLTokenOutputProcessor.java
 Mon Oct 14 14:56:32 2013
@@ -23,6 +23,7 @@ import java.security.PrivateKey;
 import java.security.PublicKey;
 import java.security.cert.X509Certificate;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 import javax.crypto.spec.SecretKeySpec;
@@ -68,6 +69,7 @@ public class SAMLTokenOutputProcessor ex
 
     public SAMLTokenOutputProcessor() throws XMLSecurityException {
         super();
+        addBeforeProcessor(WSSSignatureOutputProcessor.class.getName());
     }
 
     @Override
@@ -108,9 +110,11 @@ public class SAMLTokenOutputProcessor ex
             final FinalSAMLTokenOutputProcessor finalSAMLTokenOutputProcessor;
             
             XMLSecurityConstants.Action action = getAction();
+            boolean includeSTR = false;
 
             if (WSSConstants.SAML_TOKEN_SIGNED.equals(action) && 
senderVouches) {
                 GenericOutboundSecurityToken securityToken = null;
+                includeSTR = true;
                 
                 // See if a token is already available
                 String sigTokenId = 
@@ -174,7 +178,7 @@ public class SAMLTokenOutputProcessor ex
                 }
 
                 finalSAMLTokenOutputProcessor = new 
FinalSAMLTokenOutputProcessor(securityToken, samlAssertionWrapper,
-                        securityTokenReferenceId, senderVouches);
+                        securityTokenReferenceId, senderVouches, includeSTR);
 
                 securityToken.setProcessor(finalSAMLTokenOutputProcessor);
 
@@ -215,7 +219,7 @@ public class SAMLTokenOutputProcessor ex
                 }
 
                 finalSAMLTokenOutputProcessor = new 
FinalSAMLTokenOutputProcessor(null, samlAssertionWrapper,
-                        securityTokenReferenceId, senderVouches);
+                        securityTokenReferenceId, senderVouches, includeSTR);
 
                 SecurityTokenProvider<OutboundSecurityToken> 
securityTokenProvider =
                         new SecurityTokenProvider<OutboundSecurityToken>() {
@@ -277,16 +281,44 @@ public class SAMLTokenOutputProcessor ex
 
                 
outputProcessorChain.getSecurityContext().registerSecurityTokenProvider(tokenId,
 securityTokenProvider);
                 
outputProcessorChain.getSecurityContext().put(WSSConstants.PROP_USE_THIS_TOKEN_ID_FOR_SIGNATURE,
 tokenId);
+            } else if (WSSConstants.SAML_TOKEN_UNSIGNED.equals(getAction())) {
+                // Check to see whether this token is to be signed by the 
message signature. If so,
+                // output a STR to be signed instead, and remove this 
Assertion from the signature parts
+                // list
+                QName assertionName = new QName(WSSConstants.NS_SAML2, 
"Assertion");
+                if (samlAssertionWrapper.getSamlVersion() == 
SAMLVersion.VERSION_11) {
+                    assertionName = new QName(WSSConstants.NS_SAML, 
"Assertion");
+                }
+                
+                Iterator<SecurePart> signaturePartsIterator = 
+                    securityProperties.getSignatureSecureParts().iterator();
+                while (signaturePartsIterator.hasNext()) {
+                    SecurePart securePart = signaturePartsIterator.next();
+                    if 
(samlAssertionWrapper.getId().equals(securePart.getIdToSign())
+                        || assertionName.equals(securePart.getName())) {
+                        includeSTR = true;
+                        signaturePartsIterator.remove();
+                        break;
+                    }
+                }
+                
+                finalSAMLTokenOutputProcessor = new 
FinalSAMLTokenOutputProcessor(null, samlAssertionWrapper,
+                                                                               
   securityTokenReferenceId, senderVouches,
+                                                                               
   includeSTR);
+                if (includeSTR) {
+                    
finalSAMLTokenOutputProcessor.addBeforeProcessor(WSSSignatureOutputProcessor.class.getName());
+                }
             } else {
                 finalSAMLTokenOutputProcessor = new 
FinalSAMLTokenOutputProcessor(null, samlAssertionWrapper,
-                                                                               
   securityTokenReferenceId, senderVouches);
+                                                                               
   securityTokenReferenceId, senderVouches,
+                                                                               
   includeSTR);
             }
 
             
finalSAMLTokenOutputProcessor.setXMLSecurityProperties(getSecurityProperties());
             finalSAMLTokenOutputProcessor.setAction(action);
             finalSAMLTokenOutputProcessor.init(outputProcessorChain);
 
-            if (WSSConstants.SAML_TOKEN_SIGNED.equals(action) && 
senderVouches) {
+            if (includeSTR) {
                 SecurePart securePart =
                         new SecurePart(
                                 new 
QName(WSSConstants.SOAPMESSAGE_NS10_STRTransform),
@@ -306,9 +338,11 @@ public class SAMLTokenOutputProcessor ex
         private final SamlAssertionWrapper samlAssertionWrapper;
         private final String securityTokenReferenceId;
         private boolean senderVouches = false;
+        private boolean includeSTR = false;
 
         FinalSAMLTokenOutputProcessor(OutboundSecurityToken securityToken, 
SamlAssertionWrapper samlAssertionWrapper,
-                                      String securityTokenReferenceId, boolean 
senderVouches) throws XMLSecurityException {
+                                      String securityTokenReferenceId, boolean 
senderVouches,
+                                      boolean includeSTR) throws 
XMLSecurityException {
             super();
             
this.addAfterProcessor(UsernameTokenOutputProcessor.class.getName());
             this.addAfterProcessor(SAMLTokenOutputProcessor.class.getName());
@@ -316,6 +350,7 @@ public class SAMLTokenOutputProcessor ex
             this.securityTokenReferenceId = securityTokenReferenceId;
             this.senderVouches = senderVouches;
             this.securityToken = securityToken;
+            this.includeSTR = includeSTR;
         }
 
         @Override
@@ -346,7 +381,7 @@ public class SAMLTokenOutputProcessor ex
                 WSSUtils.updateSecurityHeaderOrder(outputProcessorChain, 
headerElementName, getAction(), false);
 
                 outputSamlAssertion(samlAssertionWrapper.toDOM(null), 
subOutputProcessorChain);
-                if (senderVouches && 
WSSConstants.SAML_TOKEN_SIGNED.equals(getAction())) {                    
+                if (includeSTR) {
                     WSSUtils.updateSecurityHeaderOrder(
                             outputProcessorChain, 
WSSConstants.TAG_wsse_SecurityTokenReference, getAction(), false);              
      
                     outputSecurityTokenReference(subOutputProcessorChain, 
samlAssertionWrapper,

Modified: 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/PrincipalTest.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/PrincipalTest.java?rev=1531927&r1=1531926&r2=1531927&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/PrincipalTest.java
 (original)
+++ 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/PrincipalTest.java
 Mon Oct 14 14:56:32 2013
@@ -117,6 +117,7 @@ public class PrincipalTest extends Abstr
             SAML1CallbackHandler callbackHandler = new SAML1CallbackHandler();
             callbackHandler.setStatement(SAML1CallbackHandler.Statement.AUTHN);
             callbackHandler.setIssuer("www.example.com");
+            callbackHandler.setSignAssertion(false);
 
             InputStream sourceDocument = 
this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml");
             String action = WSHandlerConstants.SAML_TOKEN_UNSIGNED + " " + 
WSHandlerConstants.SIGNATURE;

Modified: 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenNegativeTest.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenNegativeTest.java?rev=1531927&r1=1531926&r2=1531927&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenNegativeTest.java
 (original)
+++ 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenNegativeTest.java
 Mon Oct 14 14:56:32 2013
@@ -197,6 +197,7 @@ public class SAMLTokenNegativeTest exten
             callbackHandler.setStatement(SAML1CallbackHandler.Statement.AUTHN);
             
callbackHandler.setConfirmationMethod(SAML1Constants.CONF_HOLDER_KEY);
             callbackHandler.setIssuer("www.example.com");
+            callbackHandler.setSignAssertion(false);
 
             InputStream sourceDocument = 
this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml");
             String action = WSHandlerConstants.SAML_TOKEN_UNSIGNED;

Modified: 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenSVTest.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenSVTest.java?rev=1531927&r1=1531926&r2=1531927&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenSVTest.java
 (original)
+++ 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenSVTest.java
 Mon Oct 14 14:56:32 2013
@@ -328,6 +328,7 @@ public class SAMLTokenSVTest extends Abs
             callbackHandler.setStatement(SAML1CallbackHandler.Statement.AUTHZ);
             callbackHandler.setIssuer("www.example.com");
             callbackHandler.setResource("http://resource.org";);
+            callbackHandler.setSignAssertion(false);
 
             InputStream sourceDocument = 
this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml");
             String action = WSHandlerConstants.SAML_TOKEN_UNSIGNED;

Modified: 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenTest.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenTest.java?rev=1531927&r1=1531926&r2=1531927&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenTest.java
 (original)
+++ 
webservices/wss4j/trunk/ws-security-stax/src/test/java/org/apache/wss4j/stax/test/saml/SAMLTokenTest.java
 Mon Oct 14 14:56:32 2013
@@ -101,6 +101,7 @@ public class SAMLTokenTest extends Abstr
             SAML1CallbackHandler callbackHandler = new SAML1CallbackHandler();
             callbackHandler.setStatement(SAML1CallbackHandler.Statement.AUTHN);
             callbackHandler.setIssuer("www.example.com");
+            callbackHandler.setSignAssertion(false);
 
             InputStream sourceDocument = 
this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml");
             String action = WSHandlerConstants.SAML_TOKEN_UNSIGNED + " " + 
WSHandlerConstants.SIGNATURE;
@@ -173,6 +174,7 @@ public class SAMLTokenTest extends Abstr
             SAML1CallbackHandler callbackHandler = new SAML1CallbackHandler();
             callbackHandler.setStatement(SAML1CallbackHandler.Statement.ATTR);
             callbackHandler.setIssuer("www.example.com");
+            callbackHandler.setSignAssertion(false);
 
             InputStream sourceDocument = 
this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml");
             String action = WSHandlerConstants.SAML_TOKEN_UNSIGNED + " " + 
WSHandlerConstants.SIGNATURE;
@@ -247,6 +249,7 @@ public class SAMLTokenTest extends Abstr
             callbackHandler.setStatement(SAML1CallbackHandler.Statement.AUTHZ);
             callbackHandler.setIssuer("www.example.com");
             callbackHandler.setResource("http://resource.org";);
+            callbackHandler.setSignAssertion(false);
 
             InputStream sourceDocument = 
this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml");
             String action = WSHandlerConstants.SAML_TOKEN_UNSIGNED + " " + 
WSHandlerConstants.SIGNATURE;
@@ -320,6 +323,7 @@ public class SAMLTokenTest extends Abstr
             SAML2CallbackHandler callbackHandler = new SAML2CallbackHandler();
             callbackHandler.setStatement(SAML2CallbackHandler.Statement.AUTHN);
             callbackHandler.setIssuer("www.example.com");
+            callbackHandler.setSignAssertion(false);
 
             InputStream sourceDocument = 
this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml");
             String action = WSHandlerConstants.SAML_TOKEN_UNSIGNED + " " + 
WSHandlerConstants.SIGNATURE;
@@ -393,6 +397,7 @@ public class SAMLTokenTest extends Abstr
             SAML2CallbackHandler callbackHandler = new SAML2CallbackHandler();
             callbackHandler.setStatement(SAML2CallbackHandler.Statement.ATTR);
             callbackHandler.setIssuer("www.example.com");
+            callbackHandler.setSignAssertion(false);
 
             InputStream sourceDocument = 
this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml");
             String action = WSHandlerConstants.SAML_TOKEN_UNSIGNED + " " + 
WSHandlerConstants.SIGNATURE;
@@ -468,6 +473,7 @@ public class SAMLTokenTest extends Abstr
             callbackHandler.setStatement(SAML2CallbackHandler.Statement.AUTHZ);
             callbackHandler.setIssuer("www.example.com");
             callbackHandler.setResource("http://resource.org";);
+            callbackHandler.setSignAssertion(false);
 
             InputStream sourceDocument = 
this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml");
             String action = WSHandlerConstants.SAML_TOKEN_UNSIGNED + " " + 
WSHandlerConstants.SIGNATURE;
@@ -786,6 +792,7 @@ public class SAMLTokenTest extends Abstr
             SAML1CallbackHandler callbackHandler = new SAML1CallbackHandler();
             callbackHandler.setStatement(SAML1CallbackHandler.Statement.AUTHN);
             callbackHandler.setIssuer("www.example.com");
+            callbackHandler.setSignAssertion(false);
 
             InputStream sourceDocument = 
this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml");
             String action = WSHandlerConstants.SAML_TOKEN_UNSIGNED + " " + 
WSHandlerConstants.SIGNATURE;


Reply via email to