Author: coheigea Date: Tue Jun 8 11:19:59 2010 New Revision: 952612 URL: http://svn.apache.org/viewvc?rev=952612&view=rev Log: [WSS-226] - Forward merged to trunk.
Modified: webservices/wss4j/trunk/src/org/apache/ws/security/WSSConfig.java webservices/wss4j/trunk/src/org/apache/ws/security/action/UsernameTokenSignedAction.java webservices/wss4j/trunk/src/org/apache/ws/security/handler/RequestData.java webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandler.java webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandlerConstants.java webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecUsernameToken.java webservices/wss4j/trunk/src/org/apache/ws/security/message/token/UsernameToken.java webservices/wss4j/trunk/src/org/apache/ws/security/processor/SignatureProcessor.java webservices/wss4j/trunk/test/wssec/TestWSSecurityNew13.java Modified: webservices/wss4j/trunk/src/org/apache/ws/security/WSSConfig.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/WSSConfig.java?rev=952612&r1=952611&r2=952612&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/WSSConfig.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/WSSConfig.java Tue Jun 8 11:19:59 2010 @@ -17,6 +17,7 @@ * under the License. */ + package org.apache.ws.security; import java.util.HashMap; @@ -212,6 +213,10 @@ public class WSSConfig { */ protected boolean allowNamespaceQualifiedPasswordTypes = false; + /** + * The secret key length to be used for UT_SIGN. + */ + protected int secretKeyLength = WSConstants.WSE_DERIVED_KEY_LEN; /** * The default wsu:Id allocator is a simple "start at 1 and increment up" @@ -454,6 +459,20 @@ public class WSSConfig { } /** + * Set the secret key length to be used for UT_SIGN. + */ + public void setSecretKeyLength(int length) { + secretKeyLength = length; + } + + /** + * Get the secret key length to be used for UT_SIGN. + */ + public int getSecretKeyLength() { + return secretKeyLength; + } + + /** * @return Returns the WsuIdAllocator used to generate wsu:Id attributes */ public WsuIdAllocator getIdAllocator() { Modified: webservices/wss4j/trunk/src/org/apache/ws/security/action/UsernameTokenSignedAction.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/action/UsernameTokenSignedAction.java?rev=952612&r1=952611&r2=952612&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/action/UsernameTokenSignedAction.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/action/UsernameTokenSignedAction.java Tue Jun 8 11:19:59 2010 @@ -54,6 +54,7 @@ public class UsernameTokenSignedAction i WSSecUsernameToken builder = new WSSecUsernameToken(); builder.setWsConfig(reqData.getWssConfig()); builder.setPasswordType(reqData.getPwType()); // enhancement by Alberto Coletti + builder.setSecretKeyLength(reqData.getSecretKeyLength()); builder.setUserInfo(reqData.getUsername(), password); builder.addCreated(); Modified: webservices/wss4j/trunk/src/org/apache/ws/security/handler/RequestData.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/handler/RequestData.java?rev=952612&r1=952611&r2=952612&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/handler/RequestData.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/handler/RequestData.java Tue Jun 8 11:19:59 2010 @@ -61,6 +61,7 @@ public class RequestData { private List signatureValues = new Vector(); private WSSecHeader secHeader = null; private boolean encSymmetricEncryptionKey = true; + private int secretKeyLength = WSConstants.WSE_DERIVED_KEY_LEN; public void clear() { soapConstants = null; @@ -74,6 +75,7 @@ public class RequestData { signatureValues.clear(); signatureDigestAlgorithm = null; encSymmetricEncryptionKey = true; + secretKeyLength = WSConstants.WSE_DERIVED_KEY_LEN; signatureUser = null; } @@ -108,6 +110,14 @@ public class RequestData { public void setActor(String actor) { this.actor = actor; } + + public void setSecretKeyLength(int length) { + secretKeyLength = length; + } + + public int getSecretKeyLength() { + return secretKeyLength; + } public String getUsername() { return username; Modified: webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandler.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandler.java?rev=952612&r1=952611&r2=952612&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandler.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandler.java Tue Jun 8 11:19:59 2010 @@ -260,6 +260,7 @@ public abstract class WSHandler { wssConfig.setAllowNamespaceQualifiedPasswordTypes( decodeNamespaceQualifiedPasswordTypes(reqData) ); + wssConfig.setSecretKeyLength(reqData.getSecretKeyLength()); reqData.setWssConfig(wssConfig); if ((doAction & WSConstants.SIGN) == WSConstants.SIGN) { @@ -570,6 +571,12 @@ public abstract class WSHandler { if (parts != null) { splitEncParts(parts, reqData.getSignatureParts(), reqData); } + + String secretKeyLength = getString(WSHandlerConstants.WSE_SECRET_KEY_LENGTH, mc); + if (secretKeyLength != null) { + int iSecretKeyLength = Integer.parseInt(secretKeyLength); + reqData.setSecretKeyLength(iSecretKeyLength); + } } protected void decodeEncryptionParameter(RequestData reqData) Modified: webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandlerConstants.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandlerConstants.java?rev=952612&r1=952611&r2=952612&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandlerConstants.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandlerConstants.java Tue Jun 8 11:19:59 2010 @@ -594,9 +594,17 @@ public class WSHandlerConstants { * (<code>{}</code>). */ public static final String SIGNATURE_PARTS = "signatureParts"; + + /** + * This parameter sets the length of the secret (derived) key to use for the + * WSE UT_SIGN functionality. + * + * The default value is 16 bytes. + */ + public static final String WSE_SECRET_KEY_LENGTH = "wseSecretKeyLength"; /** - * The name of the crypto propterty file to use for SOAP Encryption. + * The name of the crypto property file to use for SOAP Encryption. * <p/> * Refer to documentation of {...@link #SIG_PROP_FILE}. * <p/> Modified: webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecUsernameToken.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecUsernameToken.java?rev=952612&r1=952611&r2=952612&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecUsernameToken.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecUsernameToken.java Tue Jun 8 11:19:59 2010 @@ -46,6 +46,7 @@ public class WSSecUsernameToken extends private boolean useMac = false; private byte[] saltValue; private int iteration = UsernameToken.DEFAULT_ITERATION; + private int secretKeyLength = WSConstants.WSE_DERIVED_KEY_LEN; /** @@ -77,6 +78,20 @@ public class WSSecUsernameToken extends } /** + * Set the secret key length + */ + public void setSecretKeyLength(int length) { + secretKeyLength = length; + } + + /** + * Get the secret key length + */ + public int getSecretKeyLength() { + return secretKeyLength; + } + + /** * Add a derived key to the UsernameToken * @param useMac whether the derived key is to be used for a MAC or not * @param saltValue The salt value to use @@ -111,7 +126,7 @@ public class WSSecUsernameToken extends if (useDerivedKey) { return UsernameToken.generateDerivedKey(password, saltValue, iteration); } - return ut.getSecretKey(); + return ut.getSecretKey(secretKeyLength); } /** Modified: webservices/wss4j/trunk/src/org/apache/ws/security/message/token/UsernameToken.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/message/token/UsernameToken.java?rev=952612&r1=952611&r2=952612&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/message/token/UsernameToken.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/message/token/UsernameToken.java Tue Jun 8 11:19:59 2010 @@ -598,6 +598,18 @@ public class UsernameToken { public byte[] getSecretKey() { return getSecretKey(WSConstants.WSE_DERIVED_KEY_LEN, WSConstants.LABEL_FOR_DERIVED_KEY); } + + /** + * Gets the secret key as per WS-Trust spec. This method uses default setting + * to generate the secret key. These default values are suitable for .NET + * WSE. + * + * @return a secret key constructed from information contained in this + * username token + */ + public byte[] getSecretKey(int keylen) { + return getSecretKey(keylen, WSConstants.LABEL_FOR_DERIVED_KEY); + } /** * Gets the secret key as per WS-Trust spec. 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=952612&r1=952611&r2=952612&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 Tue Jun 8 11:19:59 2010 @@ -90,6 +90,8 @@ public class SignatureProcessor implemen private byte[] signatureValue; + private int secretKeyLength = WSConstants.WSE_DERIVED_KEY_LEN; + private KeyInfoFactory keyInfoFactory = KeyInfoFactory.getInstance("DOM"); private XMLSignatureFactory signatureFactory = XMLSignatureFactory.getInstance("DOM"); @@ -110,6 +112,7 @@ public class SignatureProcessor implemen Principal lastPrincipalFound = null; certs = null; signatureValue = null; + secretKeyLength = wsc.getSecretKeyLength(); try { lastPrincipalFound = @@ -284,7 +287,7 @@ public class SignatureProcessor implemen if (ut.isDerivedKey()) { secretKey = ut.getDerivedKey(); } else { - secretKey = ut.getSecretKey(); + secretKey = ut.getSecretKey(secretKeyLength); } principal = ut.createPrincipal(); } else if (processor instanceof BinarySecurityTokenProcessor) { Modified: webservices/wss4j/trunk/test/wssec/TestWSSecurityNew13.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/test/wssec/TestWSSecurityNew13.java?rev=952612&r1=952611&r2=952612&view=diff ============================================================================== --- webservices/wss4j/trunk/test/wssec/TestWSSecurityNew13.java (original) +++ webservices/wss4j/trunk/test/wssec/TestWSSecurityNew13.java Tue Jun 8 11:19:59 2010 @@ -25,8 +25,11 @@ import junit.framework.TestSuite; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ws.security.WSPasswordCallback; +import org.apache.ws.security.WSSConfig; import org.apache.ws.security.WSSecurityEngine; import org.apache.ws.security.WSConstants; +import org.apache.ws.security.handler.RequestData; +import org.apache.ws.security.handler.WSHandlerConstants; import org.apache.ws.security.message.WSSecUsernameToken; import org.apache.ws.security.message.WSSecSignature; import org.apache.ws.security.message.WSSecHeader; @@ -84,7 +87,6 @@ public class TestWSSecurityNew13 extends return new TestSuite(TestWSSecurityNew13.class); } - /** * Test the specific signing method that use UsernameToken values * <p/> @@ -128,6 +130,106 @@ public class TestWSSecurityNew13 extends /** * Test the specific signing method that use UsernameToken values + * Test that uses a 32 byte key length for the secret key, instead of the default 16 bytes. + */ + public void testWSS226() throws Exception { + Document doc = SOAPUtil.toSOAPPart(SOAPMSG); + + WSSecHeader secHeader = new WSSecHeader(); + secHeader.insertSecurityHeader(doc); + + WSSecUsernameToken builder = new WSSecUsernameToken(); + builder.setPasswordType(WSConstants.PASSWORD_TEXT); + builder.setUserInfo("wernerd", "verySecret"); + builder.addCreated(); + builder.setSecretKeyLength(32); + builder.addNonce(); + builder.prepare(doc); + + WSSecSignature sign = new WSSecSignature(); + sign.setCustomTokenValueType(WSConstants.USERNAMETOKEN_NS + "#UsernameToken"); + sign.setCustomTokenId(builder.getId()); + sign.setSecretKey(builder.getSecretKey()); + sign.setKeyIdentifierType(WSConstants.CUSTOM_SYMM_SIGNING); + sign.setSignatureAlgorithm(XMLSignature.ALGO_ID_MAC_HMAC_SHA1); + + LOG.info("Before signing with UT text...."); + sign.build(doc, null, secHeader); + LOG.info("Before adding UsernameToken PW Text...."); + builder.prependToHeader(secHeader); + Document signedDoc = doc; + if (LOG.isDebugEnabled()) { + LOG.debug("Message using a 32 byte key length:"); + String outputString = + org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(signedDoc); + LOG.debug(outputString); + } + + // + // It should fail on the default key length of 16... + // + try { + secEngine.processSecurityHeader(doc, null, this, null); + fail ("An error was expected on verifying the signature"); + } catch (Exception ex) { + // expected + } + + WSSecurityEngine wss226SecurityEngine = new WSSecurityEngine(); + WSSConfig wssConfig = WSSConfig.getNewInstance(); + wssConfig.setSecretKeyLength(32); + wss226SecurityEngine.setWssConfig(wssConfig); + wss226SecurityEngine.processSecurityHeader(doc, null, this, null); + } + + /** + * Test that uses a 32 byte key length for the secret key, instead of the default 16 bytes. + * This test configures the key length via WSHandler. + */ + public void testWSS226Handler() throws Exception { + MyHandler handler = new MyHandler(); + Document doc = SOAPUtil.toSOAPPart(SOAPMSG); + + RequestData reqData = new RequestData(); + reqData.setWssConfig(WSSConfig.getNewInstance()); + java.util.Map config = new java.util.TreeMap(); + config.put("password", "verySecret"); + config.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT); + config.put(WSHandlerConstants.WSE_SECRET_KEY_LENGTH, "32"); + reqData.setUsername("wernerd"); + reqData.setMsgContext(config); + + java.util.Vector actions = new java.util.Vector(); + actions.add(new Integer(WSConstants.UT_SIGN)); + + handler.send(WSConstants.UT_SIGN, doc, reqData, actions, true); + + if (LOG.isDebugEnabled()) { + LOG.debug("Username Token Signature via WSHandler"); + String outputString = + org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(doc); + LOG.debug(outputString); + } + + // + // It should fail on the default key length of 16... + // + try { + secEngine.processSecurityHeader(doc, null, this, null); + fail ("An error was expected on verifying the signature"); + } catch (Exception ex) { + // expected + } + + handler.receive(WSConstants.UT_SIGN, reqData); + + WSSecurityEngine wss226SecurityEngine = new WSSecurityEngine(); + wss226SecurityEngine.setWssConfig(reqData.getWssConfig()); + wss226SecurityEngine.processSecurityHeader(doc, null, this, null); + } + + /** + * Test the specific signing method that use UsernameToken values * <p/> * * @throws java.lang.Exception Thrown when there is any problem in signing or verification --------------------------------------------------------------------- To unsubscribe, e-mail: wss4j-dev-unsubscr...@ws.apache.org For additional commands, e-mail: wss4j-dev-h...@ws.apache.org