summaryrefslogtreecommitdiff
path: root/eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2
diff options
context:
space:
mode:
authorThomas Lenz <thomas.lenz@egiz.gv.at>2021-01-25 19:03:25 +0100
committerThomas Lenz <thomas.lenz@egiz.gv.at>2021-01-25 19:03:38 +0100
commitb3caa532978b6337b6015b08c17ec0466d6f9670 (patch)
treef8f4c1e6ee4395bd99e4cc59f7f00411d037b74f /eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2
parent6116a5aeea9fbf519c6f28fd17c65007cd0cbf64 (diff)
downloadEAAF-Components-b3caa532978b6337b6015b08c17ec0466d6f9670.tar.gz
EAAF-Components-b3caa532978b6337b6015b08c17ec0466d6f9670.tar.bz2
EAAF-Components-b3caa532978b6337b6015b08c17ec0466d6f9670.zip
refactor PVP2 IDP module to support more than one IPvpMetadataProvider in one application
Diffstat (limited to 'eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2')
-rw-r--r--eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/validation/SignatureTrustEngineDecorator.java41
-rw-r--r--eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/validation/TrustEngineFactory.java15
-rw-r--r--eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/verification/SamlVerificationEngine.java75
3 files changed, 84 insertions, 47 deletions
diff --git a/eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/validation/SignatureTrustEngineDecorator.java b/eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/validation/SignatureTrustEngineDecorator.java
new file mode 100644
index 00000000..66393bb4
--- /dev/null
+++ b/eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/validation/SignatureTrustEngineDecorator.java
@@ -0,0 +1,41 @@
+package at.gv.egiz.eaaf.modules.pvp2.impl.validation;
+
+import org.opensaml.security.SecurityException;
+import org.opensaml.security.credential.Credential;
+import org.opensaml.xmlsec.keyinfo.KeyInfoCredentialResolver;
+import org.opensaml.xmlsec.signature.Signature;
+import org.opensaml.xmlsec.signature.support.SignatureTrustEngine;
+
+import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IPvp2MetadataProvider;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
+
+@AllArgsConstructor
+public class SignatureTrustEngineDecorator implements SignatureTrustEngine {
+
+ private SignatureTrustEngine trustEngine;
+
+ @Getter
+ private IPvp2MetadataProvider metadataProvider;
+
+ @Override
+ public boolean validate(Signature token, CriteriaSet trustBasisCriteria) throws SecurityException {
+ return trustEngine.validate(token, trustBasisCriteria);
+
+ }
+
+ @Override
+ public boolean validate(byte[] signature, byte[] content, String algorithmUri,
+ CriteriaSet trustBasisCriteria, Credential candidateCredential) throws SecurityException {
+ return trustEngine.validate(signature, content, algorithmUri, trustBasisCriteria, candidateCredential);
+
+ }
+
+ @Override
+ public KeyInfoCredentialResolver getKeyInfoResolver() {
+ return trustEngine.getKeyInfoResolver();
+
+ }
+
+}
diff --git a/eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/validation/TrustEngineFactory.java b/eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/validation/TrustEngineFactory.java
index f0758706..fe941f74 100644
--- a/eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/validation/TrustEngineFactory.java
+++ b/eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/validation/TrustEngineFactory.java
@@ -22,9 +22,6 @@ package at.gv.egiz.eaaf.modules.pvp2.impl.validation;
import java.util.ArrayList;
import java.util.List;
-import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IPvp2MetadataProvider;
-import at.gv.egiz.eaaf.modules.pvp2.exception.Pvp2InternalErrorException;
-
import org.opensaml.saml.metadata.resolver.impl.PredicateRoleDescriptorResolver;
import org.opensaml.saml.security.impl.MetadataCredentialResolver;
import org.opensaml.xmlsec.keyinfo.KeyInfoCredentialResolver;
@@ -33,9 +30,10 @@ import org.opensaml.xmlsec.keyinfo.impl.KeyInfoProvider;
import org.opensaml.xmlsec.keyinfo.impl.provider.DSAKeyValueProvider;
import org.opensaml.xmlsec.keyinfo.impl.provider.InlineX509DataProvider;
import org.opensaml.xmlsec.keyinfo.impl.provider.RSAKeyValueProvider;
-import org.opensaml.xmlsec.signature.support.SignatureTrustEngine;
import org.opensaml.xmlsec.signature.support.impl.ExplicitKeySignatureTrustEngine;
+import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IPvp2MetadataProvider;
+import at.gv.egiz.eaaf.modules.pvp2.exception.Pvp2InternalErrorException;
import lombok.extern.slf4j.Slf4j;
import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
@@ -50,7 +48,7 @@ public class TrustEngineFactory {
* @throws Pvp2InternalErrorException In case of a TrustEngine initialization
* error
*/
- public static SignatureTrustEngine getSignatureKnownKeysTrustEngine(
+ public static SignatureTrustEngineDecorator getSignatureKnownKeysTrustEngine(
final IPvp2MetadataProvider mdResolver) throws Pvp2InternalErrorException {
try {
final List<KeyInfoProvider> keyInfoProvider = new ArrayList<>();
@@ -70,10 +68,9 @@ public class TrustEngineFactory {
resolver.setKeyInfoCredentialResolver(keyInfoCredentialResolver);
resolver.initialize();
- final ExplicitKeySignatureTrustEngine engine =
- new ExplicitKeySignatureTrustEngine(resolver, keyInfoCredentialResolver);
-
- return engine;
+ return new SignatureTrustEngineDecorator(
+ new ExplicitKeySignatureTrustEngine(resolver, keyInfoCredentialResolver),
+ mdResolver);
} catch (final ComponentInitializationException e) {
log.warn("Initialization of SignatureTrustEngine FAILED.", e);
diff --git a/eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/verification/SamlVerificationEngine.java b/eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/verification/SamlVerificationEngine.java
index e0a3ab8e..8bc770eb 100644
--- a/eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/verification/SamlVerificationEngine.java
+++ b/eaaf_modules/eaaf_module_pvp2_core/src/main/java/at/gv/egiz/eaaf/modules/pvp2/impl/verification/SamlVerificationEngine.java
@@ -27,17 +27,6 @@ import javax.xml.transform.dom.DOMSource;
import javax.xml.validation.Schema;
import javax.xml.validation.Validator;
-import at.gv.egiz.eaaf.core.exceptions.EaafProtocolException;
-import at.gv.egiz.eaaf.core.exceptions.InvalidProtocolRequestException;
-import at.gv.egiz.eaaf.modules.pvp2.api.credential.EaafX509Credential;
-import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IPvp2MetadataProvider;
-import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IRefreshableMetadataProvider;
-import at.gv.egiz.eaaf.modules.pvp2.exception.SamlAssertionValidationExeption;
-import at.gv.egiz.eaaf.modules.pvp2.exception.SchemaValidationException;
-import at.gv.egiz.eaaf.modules.pvp2.impl.message.InboundMessage;
-import at.gv.egiz.eaaf.modules.pvp2.impl.message.PvpSProfileRequest;
-import at.gv.egiz.eaaf.modules.pvp2.impl.message.PvpSProfileResponse;
-
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.opensaml.core.criterion.EntityIdCriterion;
@@ -70,10 +59,20 @@ import org.opensaml.xmlsec.encryption.support.SimpleRetrievalMethodEncryptedKeyR
import org.opensaml.xmlsec.keyinfo.impl.StaticKeyInfoCredentialResolver;
import org.opensaml.xmlsec.signature.support.SignatureException;
import org.opensaml.xmlsec.signature.support.SignatureTrustEngine;
-import org.springframework.beans.factory.annotation.Autowired;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
+import at.gv.egiz.eaaf.core.exceptions.EaafProtocolException;
+import at.gv.egiz.eaaf.core.exceptions.InvalidProtocolRequestException;
+import at.gv.egiz.eaaf.modules.pvp2.api.credential.EaafX509Credential;
+import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IPvp2MetadataProvider;
+import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IRefreshableMetadataProvider;
+import at.gv.egiz.eaaf.modules.pvp2.exception.SamlAssertionValidationExeption;
+import at.gv.egiz.eaaf.modules.pvp2.exception.SchemaValidationException;
+import at.gv.egiz.eaaf.modules.pvp2.impl.message.InboundMessage;
+import at.gv.egiz.eaaf.modules.pvp2.impl.message.PvpSProfileRequest;
+import at.gv.egiz.eaaf.modules.pvp2.impl.message.PvpSProfileResponse;
+import at.gv.egiz.eaaf.modules.pvp2.impl.validation.SignatureTrustEngineDecorator;
import lombok.extern.slf4j.Slf4j;
import net.shibboleth.utilities.java.support.net.BasicURLComparator;
import net.shibboleth.utilities.java.support.net.URIException;
@@ -97,13 +96,7 @@ public class SamlVerificationEngine {
*/
private static final int TIME_JITTER = 3;
-
-
-
-
- @Autowired(required = true)
- IPvp2MetadataProvider metadataProvider;
-
+
/**
* Verify signature of a signed SAML2 object.
*
@@ -140,27 +133,36 @@ public class SamlVerificationEngine {
log.debug("PVP2X message validation FAILED. Relead metadata for entityID: {}",
msg.getEntityID());
- if (metadataProvider == null || !(metadataProvider instanceof IRefreshableMetadataProvider)
- || !((IRefreshableMetadataProvider) metadataProvider)
- .refreshMetadataProvider(msg.getEntityID())) {
- throw e;
-
- } else {
- log.trace("PVP2X metadata reload finished. Check validate message again.");
-
- if (msg instanceof PvpSProfileRequest
- && ((PvpSProfileRequest) msg).getSamlRequest() instanceof RequestAbstractType) {
- verifyRequest((RequestAbstractType) ((PvpSProfileRequest) msg).getSamlRequest(),
- sigTrustEngine);
+ if (sigTrustEngine instanceof SignatureTrustEngineDecorator) {
+ IPvp2MetadataProvider metadataProvider =
+ ((SignatureTrustEngineDecorator) sigTrustEngine).getMetadataProvider();
+ if (metadataProvider == null || !(metadataProvider instanceof IRefreshableMetadataProvider)
+ || !((IRefreshableMetadataProvider) metadataProvider).refreshMetadataProvider(msg.getEntityID())) {
+
+ throw e;
} else {
- verifyIdpResponse(((PvpSProfileResponse) msg).getResponse(), sigTrustEngine);
+ log.trace("PVP2X metadata reload finished. Check validate message again.");
- }
+ if (msg instanceof PvpSProfileRequest
+ && ((PvpSProfileRequest) msg).getSamlRequest() instanceof RequestAbstractType) {
+ verifyRequest((RequestAbstractType) ((PvpSProfileRequest) msg).getSamlRequest(),
+ sigTrustEngine);
- }
- log.trace("Second PVP2X message validation finished");
+ } else {
+ verifyIdpResponse(((PvpSProfileResponse) msg).getResponse(), sigTrustEngine);
+ }
+
+ }
+ log.trace("Second PVP2X message validation finished");
+
+ } else {
+ log.debug("TrustEninge is not of type: {} Dynamic SAML2 metadata refresh not possibile.",
+ SignatureTrustEngineDecorator.class);
+ throw e;
+
+ }
}
}
@@ -270,9 +272,6 @@ public class SamlVerificationEngine {
throw new SamlAssertionValidationExeption(ERROR_16,
new Object[] { e.getMessage() }, e);
-// } catch (final ConfigurationException e) {
-// throw new AssertionValidationExeption("pvp.12",
-// new Object[]{loggerName, e.getMessage()}, e);
}
}