Author: coheigea
Date: Mon Apr 27 11:33:51 2009
New Revision: 768930
URL: http://svn.apache.org/viewvc?rev=768930&view=rev
Log:
[WSS-177] - Added support for encryption using a symmetric key and
EncryptedKeySHA1
- Note that before the EncryptedKey data was always required to be inserted in
the security header
- Added some tests
- Changed all encryption/signature parts to be a List rather than a Vector
- Cached all calls to MessageDigest("SHA-1) to be static
Modified:
webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java
webservices/wss4j/trunk/src/org/apache/ws/security/action/SignatureConfirmationAction.java
webservices/wss4j/trunk/src/org/apache/ws/security/action/UsernameTokenSignedAction.java
webservices/wss4j/trunk/src/org/apache/ws/security/components/crypto/CryptoBase.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/WSS4JHandler.java
webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecBase.java
webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecDKEncrypt.java
webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecDKSign.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/message/token/UsernameToken.java
webservices/wss4j/trunk/src/org/apache/ws/security/processor/EncryptedDataProcessor.java
webservices/wss4j/trunk/src/org/apache/ws/security/saml/WSSecSignatureSAML.java
webservices/wss4j/trunk/src/org/apache/ws/security/util/WSSecurityUtil.java
webservices/wss4j/trunk/test/wssec/TestWSSecurityEncryptionParts.java
webservices/wss4j/trunk/test/wssec/TestWSSecurityNew14.java
webservices/wss4j/trunk/test/wssec/TestWSSecuritySignatureParts.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=768930&r1=768929&r2=768930&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java
(original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java Mon Apr
27 11:33:51 2009
@@ -380,7 +380,7 @@
/**
* <code>ENCRYPTED_KEY_SHA1_IDENTIFIER</code> is used to set the specific
key identifier
- * ThumbprintSHA1.
+ * EncryptedKeySHA1.
*
* 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
Modified:
webservices/wss4j/trunk/src/org/apache/ws/security/action/SignatureConfirmationAction.java
URL:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/action/SignatureConfirmationAction.java?rev=768930&r1=768929&r2=768930&view=diff
==============================================================================
---
webservices/wss4j/trunk/src/org/apache/ws/security/action/SignatureConfirmationAction.java
(original)
+++
webservices/wss4j/trunk/src/org/apache/ws/security/action/SignatureConfirmationAction.java
Mon Apr 27 11:33:51 2009
@@ -33,6 +33,7 @@
import org.apache.ws.security.util.WSSecurityUtil;
import org.w3c.dom.Document;
+import java.util.List;
import java.util.Vector;
public class SignatureConfirmationAction implements Action {
@@ -62,7 +63,7 @@
WSSecurityUtil.fetchAllActionResults(wshResult.getResults(),
WSConstants.UT_SIGN, signatureActions);
}
- Vector signatureParts = reqData.getSignatureParts();
+ List signatureParts = reqData.getSignatureParts();
// prepare a SignatureConfirmation token
WSSecSignatureConfirmation wsc = new WSSecSignatureConfirmation();
if (signatureActions.size() > 0) {
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=768930&r1=768929&r2=768930&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
Mon Apr 27 11:33:51 2009
@@ -19,6 +19,7 @@
package org.apache.ws.security.action;
+import java.util.List;
import java.util.Vector;
import org.apache.ws.security.WSConstants;
@@ -90,7 +91,7 @@
sign.prependToHeader(reqData.getSecHeader());
builder.prependToHeader(reqData.getSecHeader());
- Vector parts = null;
+ List parts = null;
if (reqData.getSignatureParts().size() > 0) {
parts = reqData.getSignatureParts();
} else {
Modified:
webservices/wss4j/trunk/src/org/apache/ws/security/components/crypto/CryptoBase.java
URL:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/components/crypto/CryptoBase.java?rev=768930&r1=768929&r2=768930&view=diff
==============================================================================
---
webservices/wss4j/trunk/src/org/apache/ws/security/components/crypto/CryptoBase.java
(original)
+++
webservices/wss4j/trunk/src/org/apache/ws/security/components/crypto/CryptoBase.java
Mon Apr 27 11:33:51 2009
@@ -22,6 +22,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ws.security.WSSecurityException;
+import org.apache.ws.security.util.WSSecurityUtil;
import org.bouncycastle.asn1.x509.X509Name;
@@ -453,7 +454,7 @@
MessageDigest sha = null;
try {
- sha = MessageDigest.getInstance("SHA-1");
+ sha = WSSecurityUtil.resolveMessageDigest();
sha.reset();
} catch (NoSuchAlgorithmException e) {
throw new WSSecurityException(
@@ -542,7 +543,7 @@
System.arraycopy(encoded, 22, value, 0, value.length);
MessageDigest sha;
try {
- sha = MessageDigest.getInstance("SHA-1");
+ sha = WSSecurityUtil.resolveMessageDigest();
} catch (NoSuchAlgorithmException ex) {
throw new WSSecurityException(
WSSecurityException.UNSUPPORTED_SECURITY_TOKEN,
"noSKIHandling",
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=768930&r1=768929&r2=768930&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
Mon Apr 27 11:33:51 2009
@@ -25,6 +25,7 @@
import org.apache.ws.security.components.crypto.Crypto;
import org.apache.ws.security.message.WSSecHeader;
+import java.util.List;
import java.util.Vector;
import java.security.cert.X509Certificate;
@@ -46,13 +47,13 @@
private int sigKeyId = 0;
private String sigAlgorithm = null;
private String signatureDigestAlgorithm = null;
- private Vector signatureParts = new Vector();
+ private List signatureParts = new Vector();
private Crypto encCrypto = null;
private int encKeyId = 0;
private String encSymmAlgo = null;
private String encKeyTransport = null;
private String encUser = null;
- private Vector encryptParts = new Vector();
+ private List encryptParts = new Vector();
private X509Certificate encCert = null;
private int timeToLive = 300; // Timestamp: time in seconds between
creation and expiry
private WSSConfig wssConfig = null;
@@ -168,7 +169,7 @@
this.signatureDigestAlgorithm = sigDigestAlgorithm;
}
- public Vector getSignatureParts() {
+ public List getSignatureParts() {
return signatureParts;
}
@@ -212,7 +213,7 @@
this.encUser = encUser;
}
- public Vector getEncryptParts() {
+ public List getEncryptParts() {
return encryptParts;
}
@@ -245,6 +246,7 @@
public void setWssConfig(WSSConfig wssConfig) {
this.wssConfig = wssConfig;
}
+
/**
* @return Returns the vector of stored signature values.
*/
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=768930&r1=768929&r2=768930&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
Mon Apr 27 11:33:51 2009
@@ -50,6 +50,7 @@
import java.util.Calendar;
import java.util.Date;
import java.util.Hashtable;
+import java.util.List;
import java.util.Properties;
import java.util.Vector;
@@ -846,7 +847,7 @@
return new WSPasswordCallback(username, reason);
}
- private void splitEncParts(String tmpS, Vector parts, RequestData reqData)
+ private void splitEncParts(String tmpS, List parts, RequestData reqData)
throws WSSecurityException {
WSEncryptionPart encPart = null;
String[] rawParts = StringUtil.split(tmpS, ';');
Modified:
webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSS4JHandler.java
URL:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSS4JHandler.java?rev=768930&r1=768929&r2=768930&view=diff
==============================================================================
---
webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSS4JHandler.java
(original)
+++
webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSS4JHandler.java
Mon Apr 27 11:33:51 2009
@@ -183,8 +183,8 @@
*/
public boolean doSender(MessageContext mc, RequestData reqData, boolean
isRequest) throws WSSecurityException {
- reqData.getSignatureParts().removeAllElements();
- reqData.getEncryptParts().removeAllElements();
+ reqData.getSignatureParts().clear();
+ reqData.getEncryptParts().clear();
reqData.setNoSerialization(false);
/*
* Get the action first.
Modified:
webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecBase.java
URL:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecBase.java?rev=768930&r1=768929&r2=768930&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecBase.java
(original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecBase.java
Mon Apr 27 11:33:51 2009
@@ -25,7 +25,7 @@
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-import java.util.Vector;
+import java.util.List;
/**
* This is the base class for WS Security messages. It provides common
functions
@@ -41,7 +41,7 @@
protected int keyIdentifierType = WSConstants.ISSUER_SERIAL;
- protected Vector parts = null;
+ protected List parts = null;
protected boolean doDebug = false;
@@ -56,9 +56,9 @@
/**
* Set which parts of the message to encrypt/sign. <p/>
*
- * @param parts The vector containing the WSEncryptionPart objects
+ * @param parts The list containing the WSEncryptionPart objects
*/
- public void setParts(Vector parts) {
+ public void setParts(List parts) {
this.parts = parts;
}
Modified:
webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecDKEncrypt.java
URL:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecDKEncrypt.java?rev=768930&r1=768929&r2=768930&view=diff
==============================================================================
---
webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecDKEncrypt.java
(original)
+++
webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecDKEncrypt.java
Mon Apr 27 11:33:51 2009
@@ -36,6 +36,7 @@
import javax.crypto.SecretKey;
+import java.util.List;
import java.util.Vector;
/**
@@ -78,7 +79,7 @@
return doc;
}
- private Vector doEncryption(Document doc, byte[] secretKey, Vector
references)
+ private List doEncryption(Document doc, byte[] secretKey, List references)
throws WSSecurityException {
SecretKey key = WSSecurityUtil.prepareSecretKey(this.symEncAlgo,
secretKey);
@@ -91,7 +92,7 @@
);
}
- Vector encDataRefs = new Vector();
+ List encDataRefs = new Vector();
if (envelope == null) {
envelope = doc.getDocumentElement();
}
@@ -181,14 +182,14 @@
* creates and initializes a new Reference element.
*
* @param dataRef A <code>xenc:Reference</code> element or
<code>null</code>
- * @param references A vector containing WSEncryptionPart objects
+ * @param references A list containing WSEncryptionPart objects
* @return Returns the updated <code>xenc:Reference</code> element
* @throws WSSecurityException
*/
- public Element encryptForExternalRef(Element dataRef, Vector references)
+ public Element encryptForExternalRef(Element dataRef, List references)
throws WSSecurityException {
- Vector encDataRefs = doEncryption(document, derivedKeyBytes,
references);
+ List encDataRefs = doEncryption(document, derivedKeyBytes, references);
Element referenceList = dataRef;
if (referenceList == null) {
referenceList =
@@ -221,7 +222,7 @@
}
}
- public static Element createDataRefList(Document doc, Element
referenceList, Vector encDataRefs) {
+ public static Element createDataRefList(Document doc, Element
referenceList, List encDataRefs) {
for (int i = 0; i < encDataRefs.size(); i++) {
String dataReferenceUri = (String) encDataRefs.get(i);
Element dataReference =
Modified:
webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecDKSign.java
URL:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecDKSign.java?rev=768930&r1=768929&r2=768930&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecDKSign.java
(original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecDKSign.java
Mon Apr 27 11:33:51 2009
@@ -49,6 +49,7 @@
import org.w3c.dom.Node;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import java.util.Vector;
@@ -235,13 +236,13 @@
* times to add references as required. <code>addReferencesToSign()</code>
* can be called any time after <code>prepare</code>.
*
- * @param references A vector containing <code>WSEncryptionPart</code>
objects
+ * @param references A list containing <code>WSEncryptionPart</code>
objects
* that define the parts to sign.
* @param secHeader Used to compute namespaces to be inserted by
* InclusiveNamespaces to be WSI compliant.
* @throws WSSecurityException
*/
- public void addReferencesToSign(Vector references, WSSecHeader secHeader)
+ public void addReferencesToSign(List references, WSSecHeader secHeader)
throws WSSecurityException {
Transforms transforms = null;
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=768930&r1=768929&r2=768930&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
Mon Apr 27 11:33:51 2009
@@ -44,6 +44,7 @@
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
+import java.util.List;
import java.util.Vector;
/**
@@ -55,7 +56,7 @@
*/
public class WSSecEncrypt extends WSSecEncryptedKey {
private static Log log = LogFactory.getLog(WSSecEncrypt.class.getName());
-
+
protected String symEncAlgo = WSConstants.AES_128;
protected String encCanonAlgo = null;
@@ -64,8 +65,6 @@
protected String embeddedKeyName = null;
- protected boolean useKeyIdentifier;
-
/**
* Symmetric key used in the EncrytpedKey.
*/
@@ -135,14 +134,6 @@
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.
@@ -192,14 +183,6 @@
}
/**
- * Returns if Key Identifiers should be used in KeyInfo
- * @return if Key Identifiers should be used in KeyInfo
- */
- public boolean getUseKeyIdentifier() {
- return useKeyIdentifier;
- }
-
- /**
* Initialize a WSSec Encrypt.
*
* The method prepares and initializes a WSSec Encrypt structure after the
@@ -222,23 +205,23 @@
// key (session key) for this Encrypt element. This key will be
// encrypted using the public key of the receiver
//
- if (this.ephemeralKey == null) {
+ if (ephemeralKey == null) {
if (symmetricKey == null) {
KeyGenerator keyGen = getKeyGenerator();
- this.symmetricKey = keyGen.generateKey();
+ symmetricKey = keyGen.generateKey();
}
- this.ephemeralKey = this.symmetricKey.getEncoded();
+ ephemeralKey = symmetricKey.getEncoded();
}
- if (this.symmetricKey == null) {
- this.symmetricKey = WSSecurityUtil.prepareSecretKey(symEncAlgo,
this.ephemeralKey);
+ if (symmetricKey == null) {
+ symmetricKey = WSSecurityUtil.prepareSecretKey(symEncAlgo,
ephemeralKey);
}
//
// Get the certificate that contains the public key for the public key
// algorithm that will encrypt the generated symmetric (session) key.
//
- if (this.encryptSymmKey) {
+ if (encryptSymmKey) {
X509Certificate remoteCert = null;
if (useThisCert != null) {
remoteCert = useThisCert;
@@ -253,7 +236,9 @@
}
remoteCert = certs[0];
}
- prepareInternal(this.ephemeralKey, remoteCert, crypto);
+ prepareInternal(ephemeralKey, remoteCert, crypto);
+ } else {
+ encryptedEphemeralKey = ephemeralKey;
}
}
@@ -291,9 +276,9 @@
envelope = document.getDocumentElement();
}
- String soapNamespace = WSSecurityUtil.getSOAPNamespace(envelope);
if (parts == null) {
parts = new Vector();
+ String soapNamespace = WSSecurityUtil.getSOAPNamespace(envelope);
WSEncryptionPart encP =
new WSEncryptionPart(
WSConstants.ELEM_BODY,
@@ -304,9 +289,12 @@
}
Element refs = encryptForInternalRef(null, parts);
- addInternalRefElement(refs);
-
- prependToHeader(secHeader);
+ if (encryptedKeyElement != null) {
+ addInternalRefElement(refs);
+ prependToHeader(secHeader);
+ } else {
+ WSSecurityUtil.prependChildElement(secHeader.getSecurityHeader(),
refs);
+ }
if (bstToken != null) {
prependBSTElementToHeader(secHeader);
@@ -333,14 +321,14 @@
* creates and initializes a new Reference element.
*
* @param dataRef A <code>xenc:Reference</code> element or
<code>null</code>
- * @param references A vector containing WSEncryptionPart objects
+ * @param references A list containing WSEncryptionPart objects
* @return Returns the updated <code>xenc:Reference</code> element
* @throws WSSecurityException
*/
- public Element encryptForInternalRef(Element dataRef, Vector references)
+ public Element encryptForInternalRef(Element dataRef, List references)
throws WSSecurityException {
- Vector encDataRefs =
- doEncryption(document, this.symmetricKey, references);
+ List encDataRefs =
+ doEncryption(document, symmetricKey, references);
Element referenceList = dataRef;
if (referenceList == null) {
referenceList =
@@ -370,15 +358,15 @@
* creates and initializes a new Reference element.
*
* @param dataRef A <code>xenc:Reference</code> element or
<code>null</code>
- * @param references A vector containing WSEncryptionPart objects
+ * @param references A list containing WSEncryptionPart objects
* @return Returns the updated <code>xenc:Reference</code> element
* @throws WSSecurityException
*/
- public Element encryptForExternalRef(Element dataRef, Vector references)
+ public Element encryptForExternalRef(Element dataRef, List references)
throws WSSecurityException {
- Vector encDataRefs =
- doEncryption(document, this.symmetricKey, references);
+ List encDataRefs =
+ doEncryption(document, symmetricKey, references);
Element referenceList = dataRef;
if (referenceList == null) {
referenceList =
@@ -418,14 +406,12 @@
WSSecurityUtil.prependChildElement(secHeader.getSecurityHeader(),
dataRef);
}
- private Vector doEncryption(Document doc, SecretKey secretKey, Vector
references)
+ private List doEncryption(Document doc, SecretKey secretKey, List
references)
throws WSSecurityException {
KeyInfo keyInfo = null;
- // Prepare KeyInfo if useKeyIdentifier is set
- if (useKeyIdentifier &&
- keyIdentifierType == WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER) {
+ if (keyIdentifierType == WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER) {
keyInfo = new KeyInfo(document);
SecurityTokenReference secToken = new
SecurityTokenReference(document);
secToken.addWSSENamespace();
@@ -445,11 +431,11 @@
return doEncryption(doc, secretKey, keyInfo, references);
}
- private Vector doEncryption(
+ private List doEncryption(
Document doc,
SecretKey secretKey,
KeyInfo keyInfo,
- Vector references
+ List references
) throws WSSecurityException {
XMLCipher xmlCipher = null;
@@ -482,7 +468,7 @@
);
}
- Vector encDataRef = new Vector();
+ List encDataRef = new Vector();
for (int part = 0; part < references.size(); part++) {
WSEncryptionPart encPart = (WSEncryptionPart) references.get(part);
@@ -595,25 +581,25 @@
// (password) for this algorithm, and set the cipher into encryption
// mode.
//
- if (this.symmetricKey == null) {
+ if (symmetricKey == null) {
if (embeddedKey == null) {
throw new WSSecurityException(WSSecurityException.FAILURE,
"noKeySupplied");
}
- this.symmetricKey = WSSecurityUtil.prepareSecretKey(symEncAlgo,
embeddedKey);
+ symmetricKey = WSSecurityUtil.prepareSecretKey(symEncAlgo,
embeddedKey);
}
KeyInfo keyInfo = null;
- if (this.keyIdentifierType == WSConstants.EMBEDDED_KEYNAME) {
+ if (keyIdentifierType == WSConstants.EMBEDDED_KEYNAME) {
keyInfo = new KeyInfo(doc);
keyInfo.addKeyName(embeddedKeyName == null ? user :
embeddedKeyName);
- } else if (this.keyIdentifierType ==
WSConstants.EMBED_SECURITY_TOKEN_REF) {
+ } else if (keyIdentifierType == WSConstants.EMBED_SECURITY_TOKEN_REF) {
//
// This means that we want to embed a <wsse:SecurityTokenReference>
// into keyInfo element. If we need this functionality, this.secRef
// MUST be set before calling the build(doc, crypto) method. So if
// secRef is null then throw an exception.
//
- if (this.securityTokenReference == null) {
+ if (securityTokenReference == null) {
throw new WSSecurityException(
WSSecurityException.SECURITY_TOKEN_UNAVAILABLE,
"You must set keyInfo element, if the keyIdentifier ==
EMBED_SECURITY_TOKEN_REF"
@@ -632,9 +618,9 @@
WSConstants.XMLNS_NS, "xmlns:" + WSConstants.SIG_PREFIX,
WSConstants.SIG_NS
);
- String soapNamespace = WSSecurityUtil.getSOAPNamespace(envelope);
if (parts == null) {
parts = new Vector();
+ String soapNamespace = WSSecurityUtil.getSOAPNamespace(envelope);
WSEncryptionPart encP =
new WSEncryptionPart(
WSConstants.ELEM_BODY,
@@ -643,7 +629,7 @@
);
parts.add(encP);
}
- Vector encDataRefs = doEncryption(doc, this.symmetricKey, keyInfo,
parts);
+ List encDataRefs = doEncryption(doc, symmetricKey, keyInfo, parts);
//
// At this point data is encrypted with the symmetric key and can be
@@ -702,7 +688,7 @@
public static Element createDataRefList(
Document doc,
Element referenceList,
- Vector encDataRefs
+ List encDataRefs
) {
for (int i = 0; i < encDataRefs.size(); i++) {
String dataReferenceUri = (String) encDataRefs.get(i);
@@ -756,7 +742,7 @@
private String getSHA1(byte[] input) throws WSSecurityException {
try {
- MessageDigest sha = MessageDigest.getInstance("SHA-1");
+ MessageDigest sha = WSSecurityUtil.resolveMessageDigest();
sha.reset();
sha.update(input);
byte[] data = sha.digest();
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=768930&r1=768929&r2=768930&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
Mon Apr 27 11:33:51 2009
@@ -243,10 +243,10 @@
// session key
//
encryptedKeyElement = createEncryptedKey(document, keyEncAlgo);
- if(this.encKeyId == null || "".equals(this.encKeyId)) {
- this.encKeyId = "EncKeyId-" + UUIDGenerator.getUUID();
+ if(encKeyId == null || "".equals(encKeyId)) {
+ encKeyId = "EncKeyId-" + UUIDGenerator.getUUID();
}
- encryptedKeyElement.setAttributeNS(null, "Id", this.encKeyId);
+ encryptedKeyElement.setAttributeNS(null, "Id", encKeyId);
KeyInfo keyInfo = new KeyInfo(document);
@@ -315,9 +315,6 @@
protected byte[] generateEphemeralKey() throws WSSecurityException {
try {
final SecureRandom r = WSSecurityUtil.resolveSecureRandom();
- if (r == null) {
- throw new WSSecurityException("Random generator is not
initialzed.");
- }
byte[] temp = new byte[this.keySize / 8];
r.nextBytes(temp);
return temp;
@@ -458,8 +455,8 @@
* @return Returns the BinarySecurityToken element.
*/
public Element getBinarySecurityTokenElement() {
- if (this.bstToken != null) {
- return this.bstToken.getElement();
+ if (bstToken != null) {
+ return bstToken.getElement();
}
return null;
}
@@ -490,11 +487,11 @@
* BinaruSecurityToken element.
*/
public String getBSTTokenId() {
- if (this.bstToken == null) {
+ if (bstToken == null) {
return null;
}
- return this.bstToken.getID();
+ return bstToken.getID();
}
/**
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=768930&r1=768929&r2=768930&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
Mon Apr 27 11:33:51 2009
@@ -57,6 +57,7 @@
import java.security.cert.X509Certificate;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import java.util.Vector;
@@ -482,13 +483,13 @@
* times to add references as required. <code>addReferencesToSign()</code>
* can be called any time after <code>prepare</code>.
*
- * @param references A vector containing <code>WSEncryptionPart</code>
objects
+ * @param references A list containing <code>WSEncryptionPart</code>
objects
* that define the parts to sign.
* @param secHeader Used to compute namespaces to be inserted by
* InclusiveNamespaces to be WSI compliant.
* @throws WSSecurityException
*/
- public void addReferencesToSign(Vector references, WSSecHeader secHeader)
+ public void addReferencesToSign(List references, WSSecHeader secHeader)
throws WSSecurityException {
Element envelope = document.getDocumentElement();
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=768930&r1=768929&r2=768930&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
Mon Apr 27 11:33:51 2009
@@ -397,7 +397,7 @@
Document doc = this.element.getOwnerDocument();
MessageDigest sha = null;
try {
- sha = MessageDigest.getInstance("SHA-1");
+ sha = WSSecurityUtil.resolveMessageDigest();
} catch (NoSuchAlgorithmException e1) {
throw new WSSecurityException(
WSSecurityException.FAILURE, "noSHA1availabe", null, e1
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=768930&r1=768929&r2=768930&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
Mon Apr 27 11:33:51 2009
@@ -470,7 +470,7 @@
System.arraycopy(b3, 0, b4, offset, b3.length);
- MessageDigest sha = MessageDigest.getInstance("SHA-1");
+ MessageDigest sha = WSSecurityUtil.resolveMessageDigest();
sha.reset();
sha.update(b4);
passwdDigest = Base64.encode(sha.digest());
@@ -645,7 +645,7 @@
MessageDigest sha = null;
try {
- sha = MessageDigest.getInstance("SHA-1");
+ sha = WSSecurityUtil.resolveMessageDigest();
} catch (NoSuchAlgorithmException e) {
if (DO_DEBUG) {
LOG.debug(e.getMessage(), e);
Modified:
webservices/wss4j/trunk/src/org/apache/ws/security/processor/EncryptedDataProcessor.java
URL:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/processor/EncryptedDataProcessor.java?rev=768930&r1=768929&r2=768930&view=diff
==============================================================================
---
webservices/wss4j/trunk/src/org/apache/ws/security/processor/EncryptedDataProcessor.java
(original)
+++
webservices/wss4j/trunk/src/org/apache/ws/security/processor/EncryptedDataProcessor.java
Mon Apr 27 11:33:51 2009
@@ -111,10 +111,12 @@
}
QName el = new QName(decryptedElem.getNamespaceURI(),
decryptedElem.getLocalName());
Processor proc = config.getProcessor(el);
- proc.handleToken(
- decryptedElem, crypto, decCrypto, cb, wsDocInfo,
returnResults, config
- );
- wsDocInfo.setProcessor(proc);
+ if (proc != null) {
+ proc.handleToken(
+ decryptedElem, crypto, decCrypto, cb, wsDocInfo,
returnResults, config
+ );
+ wsDocInfo.setProcessor(proc);
+ }
}
}
Modified:
webservices/wss4j/trunk/src/org/apache/ws/security/saml/WSSecSignatureSAML.java
URL:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/saml/WSSecSignatureSAML.java?rev=768930&r1=768929&r2=768930&view=diff
==============================================================================
---
webservices/wss4j/trunk/src/org/apache/ws/security/saml/WSSecSignatureSAML.java
(original)
+++
webservices/wss4j/trunk/src/org/apache/ws/security/saml/WSSecSignatureSAML.java
Mon Apr 27 11:33:51 2009
@@ -57,6 +57,7 @@
import java.security.cert.X509Certificate;
import java.util.Iterator;
+import java.util.List;
import java.util.Set;
import java.util.Vector;
@@ -481,14 +482,14 @@
* can be called anytime after <code>prepare</code>.
*
* @param references
- * A vector containing <code>WSEncryptionPart</code> objects
+ * A list containing <code>WSEncryptionPart</code> objects
* that define the parts to sign.
* @param secHeader
* Used to compute namespaces to be inserted by
* InclusiveNamespaces to be WSI compliant.
* @throws WSSecurityException
*/
- public void addReferencesToSign(Vector references, WSSecHeader secHeader)
+ public void addReferencesToSign(List references, WSSecHeader secHeader)
throws WSSecurityException {
Transforms transforms = null;
Modified:
webservices/wss4j/trunk/src/org/apache/ws/security/util/WSSecurityUtil.java
URL:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/util/WSSecurityUtil.java?rev=768930&r1=768929&r2=768930&view=diff
==============================================================================
--- webservices/wss4j/trunk/src/org/apache/ws/security/util/WSSecurityUtil.java
(original)
+++ webservices/wss4j/trunk/src/org/apache/ws/security/util/WSSecurityUtil.java
Mon Apr 27 11:33:51 2009
@@ -45,6 +45,7 @@
import javax.crypto.spec.SecretKeySpec;
import javax.xml.namespace.QName;
+import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Iterator;
@@ -68,6 +69,12 @@
private static String randomAlgorithm = null;
/**
+ * A cached MessageDigest object
+ */
+ private static MessageDigest digest = null;
+ private static String digestAlgorithm = null;
+
+ /**
* Returns the first WS-Security header element for a given actor. Only one
* WS-Security header is allowed for an actor.
*
@@ -920,6 +927,32 @@
}
/**
+ * @return a MessageDigest instance initialized with the "SHA-1"
+ * algorithm identifier
+ */
+ public static MessageDigest
+ resolveMessageDigest() throws NoSuchAlgorithmException {
+ return resolveMessageDigest("SHA-1");
+ }
+
+ /**
+ * @param algorithm
+ *
+ * @return a MessageDigest instance initialized with the identifier
+ * specified in algorithm
+ */
+ public synchronized static MessageDigest
+ resolveMessageDigest(
+ final String algorithm
+ ) throws NoSuchAlgorithmException {
+ if (digest == null || !algorithm.equals(digestAlgorithm)) {
+ digest = MessageDigest.getInstance(algorithm);
+ digestAlgorithm = algorithm;
+ }
+ return digest;
+ }
+
+ /**
* @return a list of child Nodes
*/
public static java.util.List
Modified: webservices/wss4j/trunk/test/wssec/TestWSSecurityEncryptionParts.java
URL:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/test/wssec/TestWSSecurityEncryptionParts.java?rev=768930&r1=768929&r2=768930&view=diff
==============================================================================
--- webservices/wss4j/trunk/test/wssec/TestWSSecurityEncryptionParts.java
(original)
+++ webservices/wss4j/trunk/test/wssec/TestWSSecurityEncryptionParts.java Mon
Apr 27 11:33:51 2009
@@ -50,6 +50,7 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.List;
import java.util.Vector;
/**
@@ -132,7 +133,7 @@
WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(doc);
- Vector parts = new Vector();
+ List parts = new Vector();
WSEncryptionPart encP =
new WSEncryptionPart(
"foobar",
@@ -183,7 +184,7 @@
WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(doc);
- Vector parts = new Vector();
+ List parts = new Vector();
WSEncryptionPart encP =
new WSEncryptionPart(
"foobar",
@@ -219,7 +220,7 @@
WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(doc);
- Vector parts = new Vector();
+ List parts = new Vector();
WSEncryptionPart encP =
new WSEncryptionPart(
"foobar2",
@@ -251,7 +252,7 @@
WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(doc);
- Vector parts = new Vector();
+ List parts = new Vector();
WSEncryptionPart encP =
new WSEncryptionPart(
"foobar",
@@ -285,7 +286,7 @@
WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(doc);
- Vector parts = new Vector();
+ List parts = new Vector();
WSEncryptionPart encP =
new WSEncryptionPart(
soapConstants.getBodyQName().getLocalPart(), // define the
body
Modified: webservices/wss4j/trunk/test/wssec/TestWSSecurityNew14.java
URL:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/test/wssec/TestWSSecurityNew14.java?rev=768930&r1=768929&r2=768930&view=diff
==============================================================================
--- webservices/wss4j/trunk/test/wssec/TestWSSecurityNew14.java (original)
+++ webservices/wss4j/trunk/test/wssec/TestWSSecurityNew14.java Mon Apr 27
11:33:51 2009
@@ -43,6 +43,8 @@
import java.io.IOException;
import java.io.InputStream;
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
@@ -74,6 +76,8 @@
private Crypto crypto = CryptoFactory.getInstance();
private MessageContext msgContext;
private SOAPEnvelope unsignedEnvelope;
+ private byte[] keyData;
+ private SecretKey key;
/**
* TestWSSecurity constructor
@@ -105,6 +109,11 @@
AxisClient tmpEngine = new AxisClient(new NullProvider());
msgContext = new MessageContext(tmpEngine);
unsignedEnvelope = getSOAPEnvelope();
+
+ KeyGenerator keyGen = KeyGenerator.getInstance("AES");
+ keyGen.init(128);
+ key = keyGen.generateKey();
+ keyData = key.getEncoded();
}
/**
@@ -214,7 +223,6 @@
WSSecEncrypt builder = new WSSecEncrypt();
builder.setUserInfo("16c73ab6-b892-458f-abf5-2f875f74882e",
"security");
builder.setKeyIdentifierType(WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER);
- builder.setUseKeyIdentifier(true);
LOG.info("Before Encrypting EncryptedKeySHA1....");
Document doc = unsignedEnvelope.getAsDocument();
@@ -233,6 +241,68 @@
LOG.info("After Encrypting EncryptedKeySHA1....");
verify(encryptedDoc);
}
+
+
+ /**
+ * Test that encrypts using EncryptedKeySHA1, where it uses a symmetric
key, rather than a
+ * generated session key which is then encrypted using a public key.
+ *
+ * @throws java.lang.Exception Thrown when there is any problem in
encryption or decryption
+ */
+ public void testEncryptionSHA1Symmetric() throws Exception {
+ WSSecEncrypt builder = new WSSecEncrypt();
+
builder.setKeyIdentifierType(WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER);
+ builder.setSymmetricKey(key);
+ builder.setEncryptSymmKey(false);
+
+ LOG.info("Before Encrypting EncryptedKeySHA1....");
+ Document doc = unsignedEnvelope.getAsDocument();
+ WSSecHeader secHeader = new WSSecHeader();
+ secHeader.insertSecurityHeader(doc);
+ Document encryptedDoc = builder.build(doc, crypto, secHeader);
+
+ String outputString =
+
org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(encryptedDoc);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Encrypted message with ENCRYPTED_KEY_SHA1_IDENTIFIER:");
+ LOG.debug(outputString);
+ }
+ assertTrue(outputString.indexOf("#EncryptedKeySHA1") != -1);
+
+ LOG.info("After Encrypting EncryptedKeySHA1....");
+ verify(encryptedDoc);
+ }
+
+
+ /**
+ * Test that encrypts using EncryptedKeySHA1, where it uses a symmetric
key (bytes),
+ * rather than a generated session key which is then encrypted using a
public key.
+ *
+ * @throws java.lang.Exception Thrown when there is any problem in
encryption or decryption
+ */
+ public void testEncryptionSHA1SymmetricBytes() throws Exception {
+ WSSecEncrypt builder = new WSSecEncrypt();
+
builder.setKeyIdentifierType(WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER);
+ builder.setEphemeralKey(keyData);
+ builder.setEncryptSymmKey(false);
+
+ LOG.info("Before Encrypting EncryptedKeySHA1....");
+ Document doc = unsignedEnvelope.getAsDocument();
+ WSSecHeader secHeader = new WSSecHeader();
+ secHeader.insertSecurityHeader(doc);
+ Document encryptedDoc = builder.build(doc, crypto, secHeader);
+
+ String outputString =
+
org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(encryptedDoc);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Encrypted message with ENCRYPTED_KEY_SHA1_IDENTIFIER:");
+ LOG.debug(outputString);
+ }
+ assertTrue(outputString.indexOf("#EncryptedKeySHA1") != -1);
+
+ LOG.info("After Encrypting EncryptedKeySHA1....");
+ verify(encryptedDoc);
+ }
/**
* Verifies the soap envelope.
@@ -257,6 +327,7 @@
* for Testing we supply a fixed name here.
*/
pc.setPassword("security");
+ pc.setKey(keyData);
} else {
throw new UnsupportedCallbackException(callbacks[i],
"Unrecognized Callback");
}
Modified: webservices/wss4j/trunk/test/wssec/TestWSSecuritySignatureParts.java
URL:
http://svn.apache.org/viewvc/webservices/wss4j/trunk/test/wssec/TestWSSecuritySignatureParts.java?rev=768930&r1=768929&r2=768930&view=diff
==============================================================================
--- webservices/wss4j/trunk/test/wssec/TestWSSecuritySignatureParts.java
(original)
+++ webservices/wss4j/trunk/test/wssec/TestWSSecuritySignatureParts.java Mon
Apr 27 11:33:51 2009
@@ -48,6 +48,7 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.List;
import java.util.Vector;
import javax.xml.namespace.QName;
@@ -132,7 +133,7 @@
WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(doc);
- Vector parts = new Vector();
+ List parts = new Vector();
WSEncryptionPart encP =
new WSEncryptionPart(
"foobar",
@@ -183,7 +184,7 @@
WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(doc);
- Vector parts = new Vector();
+ List parts = new Vector();
WSEncryptionPart encP =
new WSEncryptionPart(
"foobar2",
@@ -214,7 +215,7 @@
WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(doc);
- Vector parts = new Vector();
+ List parts = new Vector();
WSEncryptionPart encP =
new WSEncryptionPart(
"foobar",
@@ -247,7 +248,7 @@
WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(doc);
- Vector parts = new Vector();
+ List parts = new Vector();
WSEncryptionPart encP =
new WSEncryptionPart(
soapConstants.getBodyQName().getLocalPart(), // define the
body
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]