This is an automated email from the ASF dual-hosted git repository. billblough pushed a commit to branch RAMPART-252 in repository https://gitbox.apache.org/repos/asf/axis-axis2-java-rampart.git
commit b258a530dd3cd3c6bef1aba7ef0007168c968a48 Merge: 1d944fb c92232d Author: Andreas Veithen <veit...@apache.org> AuthorDate: Sun Jan 29 15:45:48 2017 +0000 Merge r1240268 from trunk. .../ExtendedPolicyValidatorCallbackHandler.java | 24 + .../rampart/PolicyBasedResultsValidator.java | 694 ++++++++++--------- .../java/org/apache/rampart/RampartConstants.java | 3 + .../java/org/apache/rampart/RampartEngine.java | 33 +- .../org/apache/rampart/RampartMessageData.java | 54 +- .../org/apache/rampart/TokenCallbackHandler.java | 4 +- .../rampart/builder/AsymmetricBindingBuilder.java | 238 ++++--- .../org/apache/rampart/builder/BindingBuilder.java | 318 +++++---- .../rampart/builder/SymmetricBindingBuilder.java | 152 +++-- .../rampart/builder/TransportBindingBuilder.java | 194 +++--- .../main/java/org/apache/rampart/errors.properties | 3 + .../rampart/handler/CertificateValidator.java | 45 ++ .../handler/PostDispatchVerificationHandler.java | 4 +- .../apache/rampart/handler/RampartReceiver.java | 10 +- .../apache/rampart/handler/WSDoAllReceiver.java | 39 +- .../org/apache/rampart/handler/WSDoAllSender.java | 27 +- .../handler/config/InflowConfiguration.java | 21 + .../handler/config/OutflowConfiguration.java | 21 + .../apache/rampart/policy/RampartPolicyData.java | 62 +- .../rampart/policy/model/OptimizePartsConfig.java | 11 +- .../apache/rampart/saml/SAML1AssertionHandler.java | 12 +- .../org/apache/rampart/util/MessageOptimizer.java | 25 +- .../java/org/apache/rampart/util/RampartUtil.java | 750 ++++++++++++--------- .../src/main/java/org/apache/rahas/PWCallback.java | 14 +- .../main/java/org/apache/rampart/PWCallback.java | 18 +- .../apache/axis2/oasis/ping/PingPortSkeleton.java | 31 +- .../axis2/security/InteropScenarioClient.java | 7 +- .../src/org/apache/axis2/security/PWCallback.java | 10 +- .../org/apache/axis2/security/Scenario4Test.java | 9 +- .../org/apache/axis2/security/Scenario5Test.java | 4 +- .../test/java/org/apache/rampart/RampartTest.java | 4 +- .../src/test/resources/security/s2a.service.xml | 2 +- .../test/resources/security/s4.client.axis2.xml | 5 +- .../src/test/resources/security/s4.service.xml | 5 +- .../test/resources/security/s5.client.axis2.xml | 4 +- .../org/apache/rampart/MessageBuilderTestBase.java | 3 +- .../java/org/apache/rampart/RampartEngineTest.java | 33 +- .../java/org/apache/rampart/TestCBHandler.java | 44 +- .../rampart-tests/test-resources/PWCallback.java | 8 +- .../src/main/java/org/apache/rahas/RahasData.java | 31 +- .../java/org/apache/rahas/client/STSClient.java | 30 +- .../main/java/org/apache/rahas/errors.properties | 5 +- .../org/apache/rahas/impl/SAML2TokenIssuer.java | 19 +- .../org/apache/rahas/impl/SAMLTokenIssuer.java | 49 +- .../apache/rahas/impl/SAMLTokenIssuerConfig.java | 11 +- .../org/apache/rahas/impl/SAMLTokenRenewer.java | 11 +- .../org/apache/rahas/impl/SAMLTokenValidator.java | 6 +- .../org/apache/rahas/impl/TokenIssuerUtil.java | 13 +- .../org/apache/rahas/impl/util/CommonUtil.java | 140 ++++ .../org/apache/rahas/impl/util/SAML2Utils.java | 13 +- .../java/org/apache/rahas/impl/util/SAMLUtils.java | 22 +- .../apache/rahas/impl/SAML2TokenIssuerTest.java | 73 ++ .../org/apache/rahas/impl/util/SAMLUtilsTest.java | 37 +- .../java/org/apache/rahas/test/util/TestUtil.java | 61 ++ pom.xml | 22 +- 55 files changed, 2059 insertions(+), 1429 deletions(-) diff --cc modules/rampart-core/src/main/java/org/apache/rampart/PolicyBasedResultsValidator.java index 9cd2a2b,774bf38..1eab066 --- a/modules/rampart-core/src/main/java/org/apache/rampart/PolicyBasedResultsValidator.java +++ b/modules/rampart-core/src/main/java/org/apache/rampart/PolicyBasedResultsValidator.java @@@ -556,39 -561,12 +565,37 @@@ public class PolicyBasedResultsValidato WSSecurityEngineResult[] actionResults = fetchActionResults(results, WSConstants.SIGN); // Find elements that are signed - Vector actuallySigned = new Vector(); + List<QName> actuallySigned = new ArrayList<QName>(); - if (actionResults != null) { + if (actionResults != null) { + + AlgorithmSuite suite = rpd.getAlgorithmSuite(); + - for (int j = 0; j < actionResults.length; j++) { - - WSSecurityEngineResult actionResult = actionResults[j]; + for (WSSecurityEngineResult actionResult : actionResults) { + // Validate signature algorithms + String sigMethod = null; + String canonMethod = null; + sigMethod = (String) actionResult.get(WSSecurityEngineResult.TAG_SIGNATURE_METHOD); + canonMethod = (String) actionResult + .get(WSSecurityEngineResult.TAG_CANONICALIZATION_METHOD); + + if (sigMethod == null || canonMethod == null) { + throw new RampartException("algorithmNotFound"); + } + // Check whether signature algorithm is correct + if (!(sigMethod.equals(suite.getAsymmetricSignature()) || sigMethod.equals(suite + .getSymmetricSignature()))) { + throw new RampartException("invalidAlgorithm", new String[] { + suite.getAsymmetricSignature(), sigMethod }); + } + // Check whether the canonicalization algorithm is correct + if (!canonMethod.equals(suite.getInclusiveC14n())) { + throw new RampartException("invalidAlgorithm", new String[] { + suite.getInclusiveC14n(), canonMethod }); + } + - List wsDataRefs = (List)actionResult.get(WSSecurityEngineResult.TAG_DATA_REF_URIS); - + List wsDataRefs = (List) actionResult.get(WSSecurityEngineResult.TAG_DATA_REF_URIS); + // if header was encrypted before it was signed, protected // element is 'EncryptedHeader.' the actual element is // first child element @@@ -995,29 -1012,13 +1041,29 @@@ .size()]); } + private void validateEncryptionAlgorithm(ArrayList refList, AlgorithmSuite algorithmSuite) throws RampartException { + + for (int i = 0; i < refList.size(); i++) { + WSDataRef dataRef = (WSDataRef) refList.get(i); + + //ArrayList can contain null elements + if (dataRef == null) { + continue; + } + + if (!(algorithmSuite.getEncryption().equals(dataRef.getAlgo()))) { + throw new RampartException("invalidAlgorithm", new String[]{algorithmSuite.getEncryption(), dataRef.getAlgo()}); + } + } + } + private boolean isRefIdPresent(ArrayList refList , QName qname) { - - for (int i = 0; i < refList.size() ; i++) { - WSDataRef dataRef = (WSDataRef)refList.get(i); - + + for (Object aRefList : refList) { + WSDataRef dataRef = (WSDataRef) aRefList; + //ArrayList can contain null elements - if(dataRef == null) { + if (dataRef == null) { continue; } //QName of the decrypted element diff --cc modules/rampart-core/src/main/java/org/apache/rampart/builder/SymmetricBindingBuilder.java index f8678de,acb2b73..7cc40d7 --- a/modules/rampart-core/src/main/java/org/apache/rampart/builder/SymmetricBindingBuilder.java +++ b/modules/rampart-core/src/main/java/org/apache/rampart/builder/SymmetricBindingBuilder.java @@@ -56,13 -53,8 +56,10 @@@ import org.w3c.dom.Element import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; - import java.util.Date; - import java.util.HashMap; - import java.util.Iterator; - import java.util.Vector; + import java.util.*; +import javax.xml.stream.XMLStreamReader; + public class SymmetricBindingBuilder extends BindingBuilder { @@@ -667,22 -655,13 +666,23 @@@ encr.setSymmetricEncAlgorithm(rpd.getAlgorithmSuite().getEncryption()); // Use key identifier in the KeyInfo in server side if (!rmd.isInitiator()) { - if(encrTok instanceof EncryptedKeyToken) { + if (encrTok instanceof EncryptedKeyToken) { - encr.setUseKeyIdentifier(true); + // TODO was encr.setUseKeyIdentifier(true); verify + encr.setEncKeyIdDirectId(true); - encr.setCustomReferenceValue(((EncryptedKeyToken)encrTok).getSHA1()); + encr.setCustomReferenceValue(((EncryptedKeyToken) encrTok).getSHA1()); encr.setKeyIdentifierType(WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER); - } + } + } else if (isIssuedToken) { + encr.setUseKeyIdentifier(true); + encr.setCustomReferenceValue(encrTokId); + encr.setKeyIdentifierType(WSConstants.SAML_ASSERTION_IDENTIFIER); + try { + // RampartUtil.insertSiblingAfter(rmd,this.timestampElement,getLLOMfromOM(encrTok.getToken())); + } catch (Exception e) { + log.debug("error while converting SAML issued token to a dom element"); + } } + encr.prepare(doc, RampartUtil.getEncryptionCrypto(rpd .getRampartConfig(), rmd.getCustomClassLoader())); diff --cc modules/rampart-core/src/main/java/org/apache/rampart/errors.properties index f8ac898,8e188b1..65ee52e --- a/modules/rampart-core/src/main/java/org/apache/rampart/errors.properties +++ b/modules/rampart-core/src/main/java/org/apache/rampart/errors.properties @@@ -100,6 -102,5 +102,7 @@@ requiredElementsMissing = Required Elem repeatingNonceValue = Nonce value : {0}, already seen before for user name : {1}. Possibly this could be a replay attack. invalidNonceLifeTime = Invalid value for nonceLifeTime in rampart configuration file. invalidIssuerAddress = Invalid value for Issuer +algorithmNotFound = Couldn't find the algorithm used +invalidAlgorithm = Algorithm verification failed. Required Algorithm : {0}, Algorithm found {1} invalidSignatureAlgo=Invalid signature algorithm for Asymmetric binding +