This is an automated email from the ASF dual-hosted git repository.
coheigea pushed a commit to branch coheigea/saml-refactor-new
in repository https://gitbox.apache.org/repos/asf/ws-wss4j.git
The following commit(s) were added to refs/heads/coheigea/saml-refactor-new by
this push:
new 8da5464cf Getting SAML credentials from previously processed results
8da5464cf is described below
commit 8da5464cf6870c658cc3b3e80778f4cd0cc38d93
Author: Colm O hEigeartaigh <[email protected]>
AuthorDate: Tue Jun 24 10:15:15 2025 +0100
Getting SAML credentials from previously processed results
---
.../wss4j/dom/processor/SAMLTokenProcessor.java | 17 ++++++++++++
.../wss4j/dom/str/DerivedKeyTokenSTRParser.java | 21 ++++++---------
.../wss4j/dom/str/EncryptedKeySTRParser.java | 20 +++++++-------
.../wss4j/dom/str/SecurityTokenRefSTRParser.java | 15 ++++++++---
.../apache/wss4j/dom/str/SignatureSTRParser.java | 31 ++++++++++++----------
5 files changed, 64 insertions(+), 40 deletions(-)
diff --git
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/processor/SAMLTokenProcessor.java
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/processor/SAMLTokenProcessor.java
index 8206acb5a..ff5573aab 100644
---
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/processor/SAMLTokenProcessor.java
+++
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/processor/SAMLTokenProcessor.java
@@ -151,6 +151,23 @@ public class SAMLTokenProcessor implements Processor {
}
result.put(WSSecurityEngineResult.TAG_SUBJECT,
credential.getSubject());
}
+
+ // Save subject certs and secrets for further processing
+ SAMLKeyInfo keyInfo =
+ SAMLUtil.getCredentialFromSubject(samlAssertion, new
WSSSAMLKeyInfoProcessor(data),
+ data.getSigVerCrypto());
+ if (keyInfo != null) {
+ if (keyInfo.getPublicKey() != null) {
+ result.put(WSSecurityEngineResult.TAG_PUBLIC_KEY,
keyInfo.getPublicKey());
+ }
+ if (keyInfo.getCerts() != null) {
+ result.put(WSSecurityEngineResult.TAG_X509_CERTIFICATES,
keyInfo.getCerts());
+ }
+ if (keyInfo.getSecret() != null) {
+ result.put(WSSecurityEngineResult.TAG_SECRET,
keyInfo.getSecret());
+ }
+ }
+
data.getWsDocInfo().addResult(result);
return java.util.Collections.singletonList(result);
}
diff --git
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/DerivedKeyTokenSTRParser.java
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/DerivedKeyTokenSTRParser.java
index c5573a6cf..ef34ae06c 100644
---
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/DerivedKeyTokenSTRParser.java
+++
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/DerivedKeyTokenSTRParser.java
@@ -26,9 +26,6 @@ import java.util.List;
import org.apache.wss4j.common.crypto.Crypto;
import org.apache.wss4j.common.ext.WSPasswordCallback;
import org.apache.wss4j.common.ext.WSSecurityException;
-import org.apache.wss4j.common.saml.SAMLKeyInfo;
-import org.apache.wss4j.common.saml.SAMLUtil;
-import org.apache.wss4j.common.saml.SamlAssertionWrapper;
import org.apache.wss4j.common.token.BinarySecurity;
import org.apache.wss4j.common.token.SecurityTokenReference;
import org.apache.wss4j.common.util.KeyUtils;
@@ -36,7 +33,7 @@ import org.apache.wss4j.common.util.XMLUtils;
import org.apache.wss4j.common.dom.WSConstants;
import org.apache.wss4j.common.dom.engine.WSSecurityEngineResult;
import org.apache.wss4j.common.dom.RequestData;
-import org.apache.wss4j.dom.saml.WSSSAMLKeyInfoProcessor;
+import org.w3c.dom.Element;
/**
* This implementation of STRParser is for parsing a SecurityTokenReference
element associated
@@ -105,15 +102,13 @@ public class DerivedKeyTokenSTRParser implements
STRParser {
parserResult.setSecretKey(secretKey);
} else if (action != null
&& (WSConstants.ST_UNSIGNED == action.intValue() ||
WSConstants.ST_SIGNED == action.intValue())) {
- SamlAssertionWrapper samlAssertion =
-
(SamlAssertionWrapper)result.get(WSSecurityEngineResult.TAG_SAML_ASSERTION);
- STRParserUtil.checkSamlTokenBSPCompliance(secRef,
samlAssertion.getSaml2() != null, data.getBSPEnforcer());
-
- SAMLKeyInfo keyInfo =
- SAMLUtil.getCredentialFromSubject(samlAssertion, new
WSSSAMLKeyInfoProcessor(data), data.getSigVerCrypto());
- // TODO Handle malformed SAML tokens where they don't have the
- // secret in them
- byte[] secretKey = keyInfo.getSecret();
+ // Check BSP compliance
+ Element token =
(Element)result.get(WSSecurityEngineResult.TAG_TOKEN_ELEMENT);
+ boolean saml2Token =
"urn:oasis:names:tc:SAML:2.0:assertion".equals(token.getNamespaceURI());
+ STRParserUtil.checkSamlTokenBSPCompliance(secRef, saml2Token,
data.getBSPEnforcer());
+
+ // TODO Handle malformed SAML tokens where they don't have the
secret in them
+ byte[] secretKey =
(byte[])result.get(WSSecurityEngineResult.TAG_SECRET);
parserResult.setSecretKey(secretKey);
} else {
throw new WSSecurityException(
diff --git
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/EncryptedKeySTRParser.java
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/EncryptedKeySTRParser.java
index da0540e92..ed2a0f55b 100644
---
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/EncryptedKeySTRParser.java
+++
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/EncryptedKeySTRParser.java
@@ -19,6 +19,7 @@
package org.apache.wss4j.dom.str;
+import java.security.PublicKey;
import java.security.cert.X509Certificate;
import javax.xml.namespace.QName;
@@ -105,15 +106,16 @@ public class EncryptedKeySTRParser implements STRParser {
parserResult.setCerts(certs);
} else if (action != null
&& (WSConstants.ST_UNSIGNED == action.intValue() ||
WSConstants.ST_SIGNED == action.intValue())) {
- SamlAssertionWrapper samlAssertion =
-
(SamlAssertionWrapper)result.get(WSSecurityEngineResult.TAG_SAML_ASSERTION);
- STRParserUtil.checkSamlTokenBSPCompliance(secRef,
samlAssertion.getSaml2() != null, data.getBSPEnforcer());
-
- SAMLKeyInfo keyInfo =
- SAMLUtil.getCredentialFromSubject(samlAssertion, new
WSSSAMLKeyInfoProcessor(data),
- data.getSigVerCrypto());
- parserResult.setCerts(keyInfo.getCerts());
- parserResult.setPublicKey(keyInfo.getPublicKey());
+ // Check BSP compliance
+ Element token =
(Element)result.get(WSSecurityEngineResult.TAG_TOKEN_ELEMENT);
+ boolean saml2Token =
"urn:oasis:names:tc:SAML:2.0:assertion".equals(token.getNamespaceURI());
+ STRParserUtil.checkSamlTokenBSPCompliance(secRef, saml2Token,
data.getBSPEnforcer());
+
+ // Get certificates and public key from the SAML assertion that
was previously processed
+ X509Certificate[] certs =
(X509Certificate[])result.get(WSSecurityEngineResult.TAG_X509_CERTIFICATES);
+ parserResult.setCerts(certs);
+ PublicKey publicKey =
(PublicKey)result.get(WSSecurityEngineResult.TAG_PUBLIC_KEY);
+ parserResult.setPublicKey(publicKey);
} else {
throw new WSSecurityException(
WSSecurityException.ErrorCode.UNSUPPORTED_SECURITY_TOKEN,
diff --git
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/SecurityTokenRefSTRParser.java
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/SecurityTokenRefSTRParser.java
index cf119571d..3e952147a 100644
---
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/SecurityTokenRefSTRParser.java
+++
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/SecurityTokenRefSTRParser.java
@@ -134,10 +134,17 @@ public class SecurityTokenRefSTRParser implements
STRParser {
parserResult.setPrincipal(dkt.createPrincipal());
} else if (action != null
&& (WSConstants.ST_UNSIGNED == action.intValue() ||
WSConstants.ST_SIGNED == action.intValue())) {
- SamlAssertionWrapper samlAssertion =
-
(SamlAssertionWrapper)result.get(WSSecurityEngineResult.TAG_SAML_ASSERTION);
- byte[] secretKey =
- getSecretKeyFromAssertion(samlAssertion, secRef, data);
+ // Check BSP compliance
+ Element token =
(Element)result.get(WSSecurityEngineResult.TAG_TOKEN_ELEMENT);
+ boolean saml2Token =
"urn:oasis:names:tc:SAML:2.0:assertion".equals(token.getNamespaceURI());
+ STRParserUtil.checkSamlTokenBSPCompliance(secRef, saml2Token,
data.getBSPEnforcer());
+
+ byte[] secretKey =
(byte[])result.get(WSSecurityEngineResult.TAG_SECRET);
+ if (secretKey == null) {
+ throw new WSSecurityException(
+ WSSecurityException.ErrorCode.FAILED_CHECK,
"invalidSAMLToken",
+ new Object[] {"No Secret Key"});
+ }
parserResult.setSecretKey(secretKey);
} else if (action != null
&& (WSConstants.SCT == action.intValue() || WSConstants.BST ==
action.intValue())) {
diff --git
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/SignatureSTRParser.java
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/SignatureSTRParser.java
index caa4780b0..cd23bd3d5 100644
---
a/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/SignatureSTRParser.java
+++
b/ws-security-dom/src/main/java/org/apache/wss4j/dom/str/SignatureSTRParser.java
@@ -20,6 +20,7 @@
package org.apache.wss4j.dom.str;
import java.security.Principal;
+import java.security.PublicKey;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
@@ -297,22 +298,24 @@ public class SignatureSTRParser implements STRParser {
parserResult.setSecretKey(dkt.deriveKey(keyLength, secret));
} else if (action != null
&& (WSConstants.ST_UNSIGNED == action.intValue() ||
WSConstants.ST_SIGNED == action.intValue())) {
+ // Check BSP compliance
+ Element token =
(Element)result.get(WSSecurityEngineResult.TAG_TOKEN_ELEMENT);
+ boolean saml2Token =
"urn:oasis:names:tc:SAML:2.0:assertion".equals(token.getNamespaceURI());
+ STRParserUtil.checkSamlTokenBSPCompliance(secRef, saml2Token,
data.getBSPEnforcer());
+
+ // Get certificates and public key from the SAML assertion that
was previously processed
+ X509Certificate[] certs =
(X509Certificate[])result.get(WSSecurityEngineResult.TAG_X509_CERTIFICATES);
+ if (certs != null && certs.length > 0) {
+ parserResult.setCerts(new X509Certificate[]{certs[0]});
+ }
+ PublicKey publicKey =
(PublicKey)result.get(WSSecurityEngineResult.TAG_PUBLIC_KEY);
+ parserResult.setPublicKey(publicKey);
+ byte[] secretKey =
(byte[])result.get(WSSecurityEngineResult.TAG_SECRET);
+ parserResult.setSecretKey(secretKey);
+
+ // TODO revisit this part
SamlAssertionWrapper samlAssertion =
(SamlAssertionWrapper)result.get(WSSecurityEngineResult.TAG_SAML_ASSERTION);
- STRParserUtil.checkSamlTokenBSPCompliance(secRef,
samlAssertion.getSaml2() != null, data.getBSPEnforcer());
-
- SAMLKeyInfo keyInfo = samlAssertion.getSubjectKeyInfo();
- if (keyInfo == null) {
- throw new WSSecurityException(
- WSSecurityException.ErrorCode.FAILURE,
"invalidSAMLsecurity"
- );
- }
- X509Certificate[] foundCerts = keyInfo.getCerts();
- if (foundCerts != null && foundCerts.length > 0) {
- parserResult.setCerts(new X509Certificate[]{foundCerts[0]});
- }
- parserResult.setSecretKey(keyInfo.getSecret());
- parserResult.setPublicKey(keyInfo.getPublicKey());
parserResult.setPrincipal(createPrincipalFromSAML(samlAssertion,
parserResult));
}