[java-opensaml] 01/06: OSJ-353 - Move IdP Spring support for credentials/trust into new module
Scott Cantor
cantor.2 at osu.edu
Tue Jul 5 14:26:56 UTC 2022
This is an automated email from the git hooks/post-receive script.
scantor pushed a commit to branch dev/OSJ-353
in repository java-opensaml.
View the commit online:
http://git.shibboleth.net/view/?p=java-opensaml.git;a=commit;h=72be7c2e366f942f730e1e9d6b1b34a5eadf1885
commit 72be7c2e366f942f730e1e9d6b1b34a5eadf1885
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed Jun 8 10:45:59 2022 -0400
OSJ-353 - Move IdP Spring support for credentials/trust into new module
https://shibboleth.atlassian.net/browse/OSJ-353
---
opensaml-parent/pom.xml | 2 +
opensaml-spring/.checkstyle | 15 +
opensaml-spring/.classpath | 39 +
opensaml-spring/.gitignore | 1 +
opensaml-spring/.project | 29 +
.../.settings/org.eclipse.core.resources.prefs | 6 +
.../.settings/org.eclipse.jdt.core.prefs | 413 ++++++
opensaml-spring/.settings/org.eclipse.jdt.ui.prefs | 63 +
.../.settings/org.eclipse.m2e.core.prefs | 4 +
opensaml-spring/pom.xml | 102 ++
.../opensaml/spring/SecurityNamespaceHandler.java | 90 ++
.../AbstractBasicCredentialFactoryBean.java | 207 +++
.../credential/AbstractBasicCredentialParser.java | 163 +++
.../credential/AbstractCredentialFactoryBean.java | 144 ++
.../credential/AbstractCredentialParser.java | 94 ++
.../AbstractX509CredentialFactoryBean.java | 133 ++
.../credential/AbstractX509CredentialParser.java | 141 ++
.../BasicInlineCredentialFactoryBean.java | 126 ++
.../credential/BasicInlineCredentialParser.java | 37 +
.../BasicResourceCredentialFactoryBean.java | 147 ++
.../credential/BasicResourceCredentialParser.java | 38 +
.../credential/BasicX509CredentialFactoryBean.java | 224 +++
.../X509InlineCredentialFactoryBean.java | 147 ++
.../credential/X509InlineCredentialParser.java | 36 +
.../credential/X509ResourceCredentialParser.java | 39 +
.../opensaml/spring/credential/package-info.java | 22 +
.../java/org/opensaml/spring/package-info.java | 22 +
...AbstractBasicPKIXValidationInfoFactoryBean.java | 103 ++
.../spring/trust/AbstractChainingParser.java | 61 +
.../trust/AbstractPKIXValidationInfoParser.java | 78 +
.../spring/trust/AbstractStaticPKIXParser.java | 154 ++
.../spring/trust/AbstractTrustEngineParser.java | 44 +
.../trust/CertPathPKIXValidationOptionsParser.java | 89 ++
.../org/opensaml/spring/trust/ChainingParser.java | 37 +
.../trust/ChainingSignatureTrustEngineFactory.java | 69 +
.../spring/trust/ChainingTrustEngineFactory.java | 70 +
.../trust/PKIXInlineValidationInfoFactoryBean.java | 107 ++
.../trust/PKIXInlineValidationInfoParser.java | 42 +
.../PKIXResourceValidationInfoFactoryBean.java | 112 ++
.../trust/PKIXResourceValidationInfoParser.java | 43 +
.../spring/trust/PKIXValidationOptionsParser.java | 76 +
.../spring/trust/SignatureChainingParser.java | 38 +
.../spring/trust/StaticExplicitKeyFactoryBean.java | 140 ++
.../spring/trust/StaticExplicitKeyParser.java | 62 +
.../trust/StaticExplicitKeySignatureParser.java | 66 +
.../spring/trust/StaticPKIXFactoryBean.java | 277 ++++
.../spring/trust/StaticPKIXSignatureParser.java | 66 +
.../trust/StaticPKIXX509CredentialParser.java | 62 +
.../org/opensaml/spring/trust/package-info.java | 22 +
.../src/main/resources/META-INF/spring.handlers | 1 +
.../src/main/resources/META-INF/spring.schemas | 5 +
.../main/resources/schema/shibboleth-security.xsd | 612 ++++++++
.../spring/AbstractSecurityParserTest.java | 97 ++
.../spring/credential/BasicInlineParserTest.java | 70 +
.../spring/credential/BasicResourceParserTest.java | 80 ++
.../BasicX509CredentialFactoryBeanTest.java | 60 +
.../credential/X509FilesystemParserTest.java | 88 ++
.../spring/credential/X509InlineParserTest.java | 62 +
.../spring/trust/ChainingTrustEngineTest.java | 50 +
.../org/opensaml/spring/trust/MockTrustEngine.java | 44 +
.../spring/trust/PKIXFilesystemParserTest.java | 52 +
.../spring/trust/PKIXInlineParserTest.java | 53 +
.../trust/PKIXValidationOptionsParserTest.java | 53 +
.../spring/trust/SignatureChainingParserTest.java | 56 +
.../trust/StaticExplicitKeyFactoryBeanTest.java | 97 ++
.../spring/trust/StaticExplicitKeyParserTest.java | 52 +
.../StaticExplicitKeySignatureParserTest.java | 52 +
.../spring/trust/StaticPKIXFactoryBeanTest.java | 132 ++
.../trust/StaticPKIXSignatureParserTest.java | 163 +++
.../trust/StaticPKIXX509CredentialParserTest.java | 116 ++
.../org/opensaml/spring/credential/aes-base64.txt | 1 +
.../org/opensaml/spring/credential/aes-binary.data | 1 +
.../org/opensaml/spring/credential/aes-hex.txt | 1 +
.../org/opensaml/spring/credential/bean.xml | 28 +
.../org/opensaml/spring/credential/cert.pem | 22 +
.../org/opensaml/spring/credential/certificate.pem | 52 +
.../org/opensaml/spring/credential/crl.pem | 19 +
.../org/opensaml/spring/credential/idp-signing.crt | 22 +
.../org/opensaml/spring/credential/idp-signing.key | 27 +
.../spring/credential/idp-signing.key.pass | 30 +
.../opensaml/spring/credential/inlineCertOnly.xml | 30 +
.../spring/credential/inlineKeyCertCrl.xml | 128 ++
.../spring/credential/inlinePublicOnly.xml | 17 +
.../spring/credential/inlinePublicPrivate.xml | 48 +
.../opensaml/spring/credential/inlineWrongCert.xml | 87 ++
.../org/opensaml/spring/credential/key.pem | 27 +
.../org/opensaml/spring/credential/publicKey.pem | 9 +
.../opensaml/spring/credential/resourceBasic.xml | 8 +
.../credential/resourceCertElementsKeyName.xml | 10 +
.../spring/credential/resourceCertOnly.xml | 8 +
.../spring/credential/resourceKeyCertCrl.xml | 11 +
.../spring/credential/resourcePublicOnly.xml | 9 +
.../spring/credential/resourcePublicPrivate.xml | 9 +
.../spring/credential/resourceSecretAESBase64.xml | 9 +
.../spring/credential/resourceSecretAESBinary.xml | 9 +
.../spring/credential/resourceSecretAESHex.xml | 9 +
.../opensaml/spring/credential/resourceTwoCert.xml | 8 +
.../spring/credential/resourceWrongCert.xml | 9 +
.../spring/credential/resourceWrongPublic.xml | 9 +
.../opensaml/spring/credential/resourceX509.xml | 8 +
.../spring/credential/secretKeyAESBase64.xml | 11 +
.../opensaml/spring/credential/secretKeyAESHex.xml | 11 +
.../opensaml/spring/credential/wrongPublicKey.pem | 6 +
.../resources/org/opensaml/spring/trust/cert.pem | 22 +
.../resources/org/opensaml/spring/trust/chain.xml | 41 +
.../org/opensaml/spring/trust/chainingTrue.xml | 18 +
.../opensaml/spring/trust/chainingTrueFalse.xml | 22 +
.../resources/org/opensaml/spring/trust/crl.pem | 19 +
.../opensaml/spring/trust/inlineValidationInfo.xml | 5 +
.../spring/trust/inlineValidationInfoValues.xml | 77 +
.../spring/trust/resourceValidationInfo.xml | 5 +
.../spring/trust/resourceValidationInfoValues.xml | 10 +
.../static-pkix-factory-custom-failsValidation.xml | 34 +
.../trust/static-pkix-factory-custom-success.xml | 30 +
.../spring/trust/static-pkix-factory-defaults.xml | 24 +
.../org/opensaml/spring/trust/staticExplicit.xml | 30 +
.../opensaml/spring/trust/staticExplicitNative.xml | 28 +
.../spring/trust/staticExplicitSignature.xml | 30 +
.../spring/trust/staticPKIX-nameCheckDisabled.xml | 8 +
.../org/opensaml/spring/trust/staticPKIX.xml | 8 +
.../staticPKIXCredentials-nameCheckDisabled.xml | 18 +
.../spring/trust/staticPKIXCredentials.xml | 19 +
.../org/opensaml/spring/trust/staticPKIXValues.xml | 16 +
.../spring/trust/staticPKIXValuesCertPathOpts.xml | 19 +
.../opensaml/spring/trust/validationOptions.xml | 5 +
.../spring/trust/validationOptionsValues.xml | 7 +
.../test-output/Default suite/Default test.html | 875 +++++++++++
.../test-output/Default suite/Default test.xml | 89 ++
.../test-output/Default suite/testng-failed.xml | 15 +
opensaml-spring/test-output/bullet_point.png | Bin 0 -> 356 bytes
opensaml-spring/test-output/collapseall.gif | Bin 0 -> 157 bytes
opensaml-spring/test-output/emailable-report.html | 348 +++++
opensaml-spring/test-output/failed.png | Bin 0 -> 977 bytes
opensaml-spring/test-output/index.html | 1515 ++++++++++++++++++++
opensaml-spring/test-output/jquery.min.js | 2 +
...aml.spring.credential.BasicInlineParserTest.xml | 12 +
...l.spring.credential.BasicResourceParserTest.xml | 16 +
...edential.BasicX509CredentialFactoryBeanTest.xml | 6 +
....spring.credential.X509FilesystemParserTest.xml | 14 +
...saml.spring.credential.X509InlineParserTest.xml | 10 +
...ensaml.spring.trust.ChainingTrustEngineTest.xml | 8 +
...nsaml.spring.trust.PKIXFilesystemParserTest.xml | 8 +
....opensaml.spring.trust.PKIXInlineParserTest.xml | 8 +
...pring.trust.PKIXValidationOptionsParserTest.xml | 8 +
...ml.spring.trust.SignatureChainingParserTest.xml | 6 +
...ring.trust.StaticExplicitKeyFactoryBeanTest.xml | 12 +
...ml.spring.trust.StaticExplicitKeyParserTest.xml | 6 +
....trust.StaticExplicitKeySignatureParserTest.xml | 6 +
...saml.spring.trust.StaticPKIXFactoryBeanTest.xml | 10 +
....spring.trust.StaticPKIXSignatureParserTest.xml | 12 +
...ng.trust.StaticPKIXX509CredentialParserTest.xml | 8 +
opensaml-spring/test-output/navigator-bullet.png | Bin 0 -> 352 bytes
.../old/Default suite/Default test.properties | 1 +
.../test-output/old/Default suite/classes.html | 522 +++++++
.../test-output/old/Default suite/groups.html | 1 +
.../test-output/old/Default suite/index.html | 6 +
.../test-output/old/Default suite/main.html | 2 +
.../old/Default suite/methods-alphabetical.html | 170 +++
.../old/Default suite/methods-not-run.html | 16 +
.../test-output/old/Default suite/methods.html | 170 +++
.../old/Default suite/reporter-output.html | 1 +
.../test-output/old/Default suite/testng.xml.html | 1 +
.../test-output/old/Default suite/toc.html | 30 +
opensaml-spring/test-output/old/index.html | 9 +
opensaml-spring/test-output/passed.png | Bin 0 -> 1019 bytes
opensaml-spring/test-output/skipped.png | Bin 0 -> 967 bytes
opensaml-spring/test-output/testng-failed.xml | 15 +
opensaml-spring/test-output/testng-reports.css | 326 +++++
opensaml-spring/test-output/testng-reports.js | 122 ++
opensaml-spring/test-output/testng-reports1.css | 344 +++++
opensaml-spring/test-output/testng-reports2.js | 76 +
opensaml-spring/test-output/testng-results.xml | 703 +++++++++
opensaml-spring/test-output/testng.css | 9 +
173 files changed, 13003 insertions(+)
diff --git a/opensaml-parent/pom.xml b/opensaml-parent/pom.xml
index 741bcfe3c..a6549679f 100644
--- a/opensaml-parent/pom.xml
+++ b/opensaml-parent/pom.xml
@@ -47,6 +47,8 @@
<module>../opensaml-xacml-saml-impl</module>
<module>../opensaml-profile-api</module>
<module>../opensaml-profile-impl</module>
+
+ <module>../opensaml-spring</module>
<module>../opensaml-bom</module>
<module>../opensaml-tests-bom</module>
diff --git a/opensaml-spring/.checkstyle b/opensaml-spring/.checkstyle
new file mode 100644
index 000000000..c04bf97d7
--- /dev/null
+++ b/opensaml-spring/.checkstyle
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<fileset-config file-format-version="1.2.0" simple-config="false" sync-formatter="false">
+
+ <local-check-config name="Shibboleth Checkstyle" location="/opensaml-parent/resources/checkstyle/checkstyle.xml" type="project" description="">
+ <additional-data name="cache-file" value="true"/>
+ <additional-data name="cache-props-file-location" value="null_1312636288299_cache.properties"/>
+ <additional-data name="cache-file-location" value="null_1312636288299_cache.xml"/>
+ </local-check-config>
+
+ <fileset name="main source" enabled="true" check-config-name="Shibboleth Checkstyle" local="true">
+ <file-match-pattern match-pattern="src/main/java/.*\.java$" include-pattern="true"/>
+ </fileset>
+
+</fileset-config>
diff --git a/opensaml-spring/.classpath b/opensaml-spring/.classpath
new file mode 100644
index 000000000..6fc81d614
--- /dev/null
+++ b/opensaml-spring/.classpath
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" output="target/classes" path="src/main/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="src" output="target/test-classes" path="src/test/java">
+ <attributes>
+ <attribute name="test" value="true"/>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+ <attributes>
+ <attribute name="test" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
+ <attributes>
+ <attribute name="module" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/opensaml-spring/.gitignore b/opensaml-spring/.gitignore
new file mode 100644
index 000000000..b83d22266
--- /dev/null
+++ b/opensaml-spring/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/opensaml-spring/.project b/opensaml-spring/.project
new file mode 100644
index 000000000..939c09743
--- /dev/null
+++ b/opensaml-spring/.project
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>opensaml-spring</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.m2e.core.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.m2e.core.maven2Nature</nature>
+ <nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/opensaml-spring/.settings/org.eclipse.core.resources.prefs b/opensaml-spring/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 000000000..29abf9995
--- /dev/null
+++ b/opensaml-spring/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/<project>=UTF-8
diff --git a/opensaml-spring/.settings/org.eclipse.jdt.core.prefs b/opensaml-spring/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..7dda60bd3
--- /dev/null
+++ b/opensaml-spring/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,413 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=17
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=17
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=16
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=1
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/opensaml-spring/.settings/org.eclipse.jdt.ui.prefs b/opensaml-spring/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 000000000..86c79c4bc
--- /dev/null
+++ b/opensaml-spring/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+cleanup.add_default_serial_version_id=false
+cleanup.add_generated_serial_version_id=true
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=false
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=true
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=true
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=true
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=true
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_parentheses_in_expressions=true
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup_profile=_Shibboleth
+cleanup_settings_version=2
+eclipse.preferences.version=1
+formatter_profile=_Shibboleth
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=false
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Commen [...]
diff --git a/opensaml-spring/.settings/org.eclipse.m2e.core.prefs b/opensaml-spring/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 000000000..f897a7f1c
--- /dev/null
+++ b/opensaml-spring/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/opensaml-spring/pom.xml b/opensaml-spring/pom.xml
new file mode 100644
index 000000000..3b71e1f74
--- /dev/null
+++ b/opensaml-spring/pom.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.opensaml</groupId>
+ <artifactId>opensaml-parent</artifactId>
+ <version>5.0.0-SNAPSHOT</version>
+ <relativePath>../opensaml-parent</relativePath>
+ </parent>
+
+ <name>OpenSAML :: Spring Support</name>
+ <description>Spring Support</description>
+ <artifactId>opensaml-spring</artifactId>
+ <packaging>jar</packaging>
+
+ <properties>
+ <automatic.module.name>org.opensaml.spring</automatic.module.name>
+ </properties>
+
+ <dependencies>
+ <!-- Compile Dependencies -->
+
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>opensaml-security-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>opensaml-security-impl</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>opensaml-xmlsec-impl</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>net.shibboleth.ext</groupId>
+ <artifactId>spring-extensions</artifactId>
+ <!-- Exception to usual test scope. -->
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.google.code.findbugs</groupId>
+ <artifactId>jsr305</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ </dependency>
+
+ <!-- Provided Dependencies -->
+
+ <!-- Runtime Dependencies -->
+
+ <!-- Test Dependencies -->
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <scm>
+ <connection>${shibboleth.scm.connection}java-opensaml</connection>
+ <developerConnection>${shibboleth.scm.developerConnection}java-opensaml</developerConnection>
+ <url>${shibboleth.scm.url}java-opensaml.git</url>
+ </scm>
+
+ <distributionManagement>
+ <site>
+ <id>site</id>
+ <url>scp:${opensaml-module.site.url}</url>
+ </site>
+ </distributionManagement>
+
+
+</project>
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/SecurityNamespaceHandler.java b/opensaml-spring/src/main/java/org/opensaml/spring/SecurityNamespaceHandler.java
new file mode 100644
index 000000000..0660bd541
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/SecurityNamespaceHandler.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring;
+
+import javax.annotation.Nonnull;
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.credential.BasicInlineCredentialParser;
+import org.opensaml.spring.credential.BasicResourceCredentialParser;
+import org.opensaml.spring.credential.X509InlineCredentialParser;
+import org.opensaml.spring.credential.X509ResourceCredentialParser;
+import org.opensaml.spring.trust.CertPathPKIXValidationOptionsParser;
+import org.opensaml.spring.trust.ChainingParser;
+import org.opensaml.spring.trust.PKIXInlineValidationInfoParser;
+import org.opensaml.spring.trust.PKIXResourceValidationInfoParser;
+import org.opensaml.spring.trust.PKIXValidationOptionsParser;
+import org.opensaml.spring.trust.SignatureChainingParser;
+import org.opensaml.spring.trust.StaticExplicitKeyParser;
+import org.opensaml.spring.trust.StaticExplicitKeySignatureParser;
+import org.opensaml.spring.trust.StaticPKIXSignatureParser;
+import org.opensaml.spring.trust.StaticPKIXX509CredentialParser;
+
+import net.shibboleth.ext.spring.util.BaseSpringNamespaceHandler;
+
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+
+/** Namespace handler for {@link #SECURITY_NAMESPACE}. */
+public class SecurityNamespaceHandler extends BaseSpringNamespaceHandler {
+
+ /** Namespace for Security. */
+ @Nonnull @NotEmpty public static final String SECURITY_NAMESPACE = "urn:mace:shibboleth:2.0:security";
+
+ /** Credential element name. */
+ @Nonnull public static final QName CREDENTIAL_ELEMENT_NAME = new QName(SECURITY_NAMESPACE, "Credential");
+
+ /** TrustEngine Element name. */
+ @Nonnull public static final QName TRUST_ENGINE_ELEMENT_NAME = new QName(SECURITY_NAMESPACE, "TrustEngine");
+
+ /** TrustEngineRef element name. */
+ @Nonnull public static final QName TRUST_ENGINE_REF = new QName(SECURITY_NAMESPACE, "TrustEngineRef");
+
+ /** {@inheritDoc} */
+ @Override public void init() {
+ // Credentials
+ registerBeanDefinitionParser(X509ResourceCredentialParser.TYPE_NAME_RESOURCE,
+ new X509ResourceCredentialParser());
+ registerBeanDefinitionParser(X509InlineCredentialParser.TYPE_NAME, new X509InlineCredentialParser());
+ registerBeanDefinitionParser(BasicInlineCredentialParser.TYPE_NAME, new BasicInlineCredentialParser());
+ registerBeanDefinitionParser(BasicResourceCredentialParser.TYPE_NAME_RESOURCE,
+ new BasicResourceCredentialParser());
+
+ registerBeanDefinitionParser(StaticExplicitKeySignatureParser.TYPE_NAME,
+ new StaticExplicitKeySignatureParser());
+ registerBeanDefinitionParser(StaticPKIXSignatureParser.TYPE_NAME, new StaticPKIXSignatureParser());
+ registerBeanDefinitionParser(SignatureChainingParser.TYPE_NAME, new SignatureChainingParser());
+
+ // Validation Info
+ registerBeanDefinitionParser(PKIXResourceValidationInfoParser.TYPE_NAME_RESOURCE,
+ new PKIXResourceValidationInfoParser());
+ registerBeanDefinitionParser(PKIXInlineValidationInfoParser.SCHEMA_TYPE, new PKIXInlineValidationInfoParser());
+
+ // Validation Opts
+ registerBeanDefinitionParser(PKIXValidationOptionsParser.ELEMENT_NAME, new PKIXValidationOptionsParser());
+ registerBeanDefinitionParser(CertPathPKIXValidationOptionsParser.ELEMENT_NAME,
+ new CertPathPKIXValidationOptionsParser());
+
+ //
+ // Trust Engines needed for the HttpMetadataProvider
+ //
+ registerBeanDefinitionParser(ChainingParser.TYPE_NAME, new ChainingParser());
+ registerBeanDefinitionParser(StaticExplicitKeyParser.TYPE_NAME, new StaticExplicitKeyParser());
+ registerBeanDefinitionParser(StaticPKIXX509CredentialParser.TYPE_NAME, new StaticPKIXX509CredentialParser());
+
+ }
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractBasicCredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractBasicCredentialFactoryBean.java
new file mode 100644
index 000000000..dd7ffe6a8
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractBasicCredentialFactoryBean.java
@@ -0,0 +1,207 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.UnsupportedEncodingException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.crypto.SecretKey;
+
+import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+
+import org.apache.commons.codec.binary.Base64;
+import org.bouncycastle.util.encoders.Hex;
+import org.opensaml.security.credential.BasicCredential;
+import org.opensaml.security.credential.UsageType;
+import org.opensaml.security.crypto.KeySupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.BeanCreationException;
+
+/**
+ * A factory bean to collect information to do with a {@link BasicCredential}.
+ */
+public abstract class AbstractBasicCredentialFactoryBean extends AbstractCredentialFactoryBean<BasicCredential> {
+
+ /** Form of encoding for SecretKey info. */
+ public enum SecretKeyEncoding {
+ /** Raw binary encoding. */
+ binary,
+ /** Hexidecimal encoding. */
+ hex,
+ /** Base64 encoding. */
+ base64
+ }
+
+ /** Log. */
+ private final Logger log = LoggerFactory.getLogger(AbstractBasicCredentialFactoryBean.class);
+
+ /** The SecretKey algorithm. */
+ @Nullable private String secretKeyAlgorithm;
+
+ /** The SecretKey encoding used. */
+ @Nullable private SecretKeyEncoding secretKeyEncoding = SecretKeyEncoding.base64;
+
+ /**
+ * Decode the SecretKey data, based on the specified encoding.
+ *
+ * @param data the Secret key data
+ * @return the decoded SecretKey byte array
+ */
+ protected byte[] decodeSecretKey(final String data) {
+ Constraint.isNotNull(data, "SecretKey data was null");
+ switch (getSecretKeyEncoding()) {
+ case binary:
+ // This sort of doesn't make sense for the String input, but just assume it's UTF-8
+ try {
+ return data.getBytes("UTF-8");
+ } catch (final UnsupportedEncodingException e) {
+ // Can't actually happen, UTF-8 always supported.
+ return null;
+ }
+ case hex:
+ return Hex.decode(data);
+ case base64:
+ return Base64.decodeBase64(data);
+ default:
+ throw new IllegalArgumentException("Saw unsupported encoding: " + getSecretKeyEncoding());
+
+ }
+ }
+
+ /**
+ * Decode the SecretKey data, based on the specified encoding.
+ *
+ * @param data the Secret key data
+ * @return the decoded SecretKey byte array
+ */
+ protected byte[] decodeSecretKey(final byte[] data) {
+ Constraint.isNotNull(data, "SecretKey data was null");
+ switch (getSecretKeyEncoding()) {
+ case binary:
+ return data;
+ case hex:
+ return Hex.decode(data);
+ case base64:
+ return Base64.decodeBase64(data);
+ default:
+ throw new IllegalArgumentException("Saw unsupported encoding: " + getSecretKeyEncoding());
+
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override protected BasicCredential doCreateInstance() throws Exception {
+
+ final PrivateKey privateKey = getPrivateKey();
+ final PublicKey publicKey = getPublicKey();
+ final SecretKey secretKey = getSecretKey();
+ final BasicCredential credential;
+
+ // Asymmetric credential
+ if (null != publicKey) {
+ if (null == privateKey) {
+ credential = new BasicCredential(publicKey);
+ } else {
+ if (!KeySupport.matchKeyPair(publicKey, privateKey)) {
+ log.error("{}: Public and private keys do not match", getConfigDescription());
+ throw new BeanCreationException("Public and private keys do not match");
+ }
+ credential = new BasicCredential(publicKey, privateKey);
+ }
+ // Symmetric credential
+ } else if (null != secretKey) {
+ credential = new BasicCredential(secretKey);
+ } else {
+ throw new BeanCreationException("Neither public key nor secret key specified");
+ }
+
+ if (null != getUsageType()) {
+ credential.setUsageType(UsageType.valueOf(getUsageType()));
+ }
+ return credential;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Class<?> getObjectType() {
+ return BasicCredential.class;
+ }
+
+ /**
+ * Get the algorithm for the SecretKey.
+ *
+ * @return Returns the SecretKey algorithm
+ */
+ @Nullable public String getSecretKeyAlgorithm() {
+ return secretKeyAlgorithm;
+ }
+
+ /**
+ * Set the algorithm for the SecretKey.
+ *
+ * @param algorithm The algorithm to set.
+ */
+ public void setSecretKeyAlgorithm(@Nonnull final String algorithm) {
+ secretKeyAlgorithm = Constraint.isNotNull(StringSupport.trimOrNull(algorithm),
+ "SecretKey algorithm may not be null");
+ }
+
+ /**
+ * Get the SecretKey encoding. Defaults to: base64.
+ *
+ * @return the encoding
+ */
+ public SecretKeyEncoding getSecretKeyEncoding() {
+ return secretKeyEncoding;
+ }
+
+ /**
+ * Set the SecretKey encoding. Defaults to: base64
+ *
+ * @param encoding the new encoding
+ */
+ public void setSecretKeyEncoding(@Nonnull final SecretKeyEncoding encoding) {
+ secretKeyEncoding = Constraint.isNotNull(encoding, "SecretKey encoding may not be null");
+ }
+
+ /**
+ * return the configured Public Key.
+ *
+ * @return the key, or none if not configured.
+ */
+ @Nullable protected abstract PublicKey getPublicKey();
+
+ /**
+ * Get the configured Private key.
+ *
+ * @return the key or null if non configured
+ */
+ @Nullable protected abstract PrivateKey getPrivateKey();
+
+ /**
+ * return the configured Secret Key.
+ *
+ * @return the key, or none if not configured.
+ */
+ @Nullable protected abstract SecretKey getSecretKey();
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractBasicCredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractBasicCredentialParser.java
new file mode 100644
index 000000000..39c58aacb
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractBasicCredentialParser.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.xml.namespace.QName;
+
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Specific parser for all BasicCredentials.
+ *
+ * <p>
+ * This does the work of putting the element values into strings. The bean factory then does the correct thing - with
+ * some help from Spring doing auto-conversion.
+ * </p>
+ */
+public abstract class AbstractBasicCredentialParser extends AbstractCredentialParser {
+
+ /** <PrivateKey>. */
+ public static final QName PRIVATE_KEY_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "PrivateKey");
+
+ /** <PublicKey>. */
+ public static final QName PUBLIC_KEY_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "PublicKey");
+
+ /** <SecretKey>. */
+ public static final QName SECRET_KEY_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "SecretKey");
+
+ /** log. */
+ private final Logger log = LoggerFactory.getLogger(AbstractBasicCredentialParser.class);
+
+ /** {@inheritDoc} */
+ @Override protected void doParse(final Element element, final ParserContext parserContext,
+ final BeanDefinitionBuilder builder) {
+ super.doParse(element, parserContext, builder);
+ builder.addPropertyValue("configDescription", parserContext.getReaderContext().getResource().getDescription());
+
+ parsePrivateKey(ElementSupport.getChildElements(element, PRIVATE_KEY_ELEMENT_NAME), parserContext, builder);
+ parsePublicKey(ElementSupport.getChildElements(element, PUBLIC_KEY_ELEMENT_NAME), parserContext, builder);
+ parseSecretKey(ElementSupport.getChildElements(element, SECRET_KEY_ELEMENT_NAME), parserContext, builder);
+ }
+
+ /**
+ * Parse the <PrivateKey> element.
+ *
+ * @param childElements the elements containing the private key, may be null or empty.
+ * @param parserContext used for logging.
+ * @param builder the builder.
+ */
+ private void parsePrivateKey(@Nullable final List<Element> childElements, final ParserContext parserContext,
+ @Nonnull final BeanDefinitionBuilder builder) {
+ if (null == childElements || childElements.isEmpty()) {
+ return;
+ }
+ if (childElements.size() > 1) {
+ log.error("{}: More than one <PrivateKey> Elements present.", parserContext.getReaderContext()
+ .getResource().getDescription());
+ throw new BeanCreationException("More than one <PrivateKey> Elements present.");
+ }
+ final Element key = childElements.get(0);
+ final String value = StringSupport.trimOrNull(key.getTextContent());
+ if (null == value) {
+ log.error("{}: <PrivateKey> Must contain text.", parserContext.getReaderContext().getResource()
+ .getDescription());
+ throw new BeanCreationException("<PrivateKey> Must contain text.");
+ }
+ log.debug("Found a private key <Supressed>");
+ builder.addPropertyValue("privateKeyInfo", value);
+ builder.addPropertyValue("privateKeyPassword", key.getAttributeNS(null, "password"));
+ }
+
+ /**
+ * Parse the <PublicKey> elements.
+ *
+ * @param childElements the elements containing the public key, must have exactly one element
+ * @param parserContext used for logging.
+ * @param builder the builder
+ */
+ private void parsePublicKey(@Nullable final List<Element> childElements, final ParserContext parserContext,
+ @Nonnull final BeanDefinitionBuilder builder) {
+ if (null == childElements || childElements.isEmpty()) {
+ return;
+ }
+ if (childElements.size() > 1) {
+ log.error("{}: More than one <PublicKey> elements present.", parserContext.getReaderContext().getResource()
+ .getDescription());
+ throw new BeanCreationException("More than one <PublicKey> elements present.");
+ }
+ final Element key = childElements.get(0);
+ final String value = StringSupport.trimOrNull(key.getTextContent());
+ if (null == value) {
+ log.error("{}: <PublicKey> Must contain text.", parserContext.getReaderContext().getResource()
+ .getDescription());
+ throw new BeanCreationException("<PublicKey> Must contain text.");
+ }
+ log.debug("Found a public key {}", value);
+ builder.addPropertyValue("publicKeyInfo", value);
+
+ if (key.hasAttributeNS(null, "password")) {
+ log.warn("password on public key is ignored");
+ }
+ }
+
+ /**
+ * Parse the <SecretKey> element.
+ *
+ * @param childElements the elements containing the private key, may be null or empty.
+ * @param parserContext used for logging.
+ * @param builder the builder
+ */
+ private void parseSecretKey(@Nullable final List<Element> childElements, final ParserContext parserContext,
+ @Nonnull final BeanDefinitionBuilder builder) {
+ if (null == childElements || childElements.isEmpty()) {
+ return;
+ }
+ if (childElements.size() > 1) {
+ log.error("{}: More than one <SecretKey> Elements present.", parserContext.getReaderContext().getResource()
+ .getDescription());
+ throw new BeanCreationException("More than one <SecretKey> Elements present.");
+ }
+ final Element key = childElements.get(0);
+ final String value = StringSupport.trimOrNull(key.getTextContent());
+ if (null == value) {
+ log.error("{}: <SecretKey> Must contain text.", parserContext.getReaderContext().getResource()
+ .getDescription());
+ throw new BeanCreationException("<SecretKey> Must contain text.");
+ }
+ log.debug("Found a secret key <Supressed>");
+ builder.addPropertyValue("secretKeyInfo", value);
+ builder.addPropertyValue("secretKeyAlgorithm", StringSupport.trimOrNull(key.getAttributeNS(null, "algorithm")));
+ builder.addPropertyValue("secretKeyEncoding", StringSupport.trimOrNull(key.getAttributeNS(null, "encoding")));
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractCredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractCredentialFactoryBean.java
new file mode 100644
index 000000000..82a895110
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractCredentialFactoryBean.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.opensaml.security.credential.Credential;
+
+import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
+
+/**
+ * A factory bean to accumulate the information pertaining to an
+ * {@link org.opensaml.security.credential.AbstractCredential}.
+ * @param <T> the type of credential to create.
+ */
+public abstract class AbstractCredentialFactoryBean<T extends Credential> extends AbstractComponentAwareFactoryBean<T> {
+
+ /** Usage type of the credential. */
+ private String usageType;
+
+ /** Names for the key represented by the credential. */
+ private List<String> keyNames;
+
+ /** Identifier for the owner of the credential. */
+ private String entityID;
+
+ /** The privateKey Password (if any). */
+ @Nullable private char[] privateKeyPassword;
+
+ /** For logging: The description of the source of the configuration.*/
+ @Nonnull private String configDescription;
+
+ /**
+ * Gets the names for the key represented by the credential.
+ *
+ * @return names for the key represented by the credential
+ */
+ @Nullable public List<String> getKeyNames() {
+ return keyNames;
+ }
+
+ /**
+ * Gets the usage type of the credential.
+ *
+ * @return usage type of the credential
+ */
+ @Nullable public String getUsageType() {
+ return usageType;
+ }
+
+ /**
+ * Get the entity ID of the credential.
+ *
+ * @return the entity ID
+ */
+ @Nullable public String getEntityID() {
+ return entityID;
+ }
+
+ /**
+ * Sets the names for the key represented by the credential.
+ *
+ * @param names names for the key represented by the credential
+ */
+ public void setKeyNames(@Nullable final List<String> names) {
+ keyNames = names;
+ }
+
+ /**
+ * Sets the usage type of the credential.
+ *
+ * @param type usage type of the credential
+ */
+ public void setUsageType(@Nullable final String type) {
+ if (null != type) {
+ usageType = type.toUpperCase();
+ } else {
+ usageType = type;
+ }
+ }
+
+ /**
+ * Set the entity ID of the credential.
+ *
+ * @param newEntityID the entity ID
+ */
+ public void setEntityID(@Nullable final String newEntityID) {
+ entityID = newEntityID;
+ }
+
+ /**
+ * Get the password for the private key.
+ *
+ * @return Returns the privateKeyPassword.
+ */
+ @Nullable public char[] getPrivateKeyPassword() {
+ return privateKeyPassword;
+ }
+
+ /**
+ * Set the password for the private key.
+ *
+ * @param password The password to set.
+ */
+ public void setPrivateKeyPassword(@Nullable final char[] password) {
+ if (null != password && password.length > 0) {
+ privateKeyPassword = password;
+ } else {
+ privateKeyPassword = null;
+ }
+ }
+
+ /** For logging, get the description of the resource that defined this bean.
+ * @return Returns the description.
+ */
+ public String getConfigDescription() {
+ return configDescription;
+ }
+
+ /** For logging, set the description of the resource that defined this bean.
+ * @param desc what to set.
+ */
+ public void setConfigDescription(@Nonnull final String desc) {
+ configDescription = desc;
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractCredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractCredentialParser.java
new file mode 100644
index 000000000..1fb81037c
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractCredentialParser.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+import net.shibboleth.ext.spring.util.AbstractCustomBeanDefinitionParser;
+import net.shibboleth.ext.spring.util.SpringSupport;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+/**
+ * Base parser for all <Credential> elements.
+ */
+public abstract class AbstractCredentialParser extends AbstractCustomBeanDefinitionParser {
+
+ /** <Credential>. */
+ public static final QName CREDENTIAL_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "Credential");
+
+ /** <KeyName>. */
+ public static final QName KEY_NAME_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "KeyName");
+
+ /** {@inheritDoc} */
+ @Override protected String resolveId(final Element element, final AbstractBeanDefinition definition,
+ final ParserContext parserContext) {
+ return StringSupport.trimOrNull(element.getAttributeNS(null, "id"));
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void doParse(final Element element, final ParserContext parserContext,
+ final BeanDefinitionBuilder builder) {
+ super.doParse(element, parserContext, builder);
+
+ builder.setLazyInit(true);
+
+ parseAttributes(element, builder);
+ parseKeyNames(ElementSupport.getChildElements(element, KEY_NAME_ELEMENT_NAME), builder);
+ }
+
+ /**
+ * Parse the credential element attributes.
+ *
+ * @param element credential element
+ * @param builder bean definition builder
+ */
+ protected void parseAttributes(final Element element, final BeanDefinitionBuilder builder) {
+ final String usage = StringSupport.trimOrNull(element.getAttributeNS(null, "usage"));
+ builder.addPropertyValue("usageType", usage);
+
+ final String entityID = StringSupport.trimOrNull(element.getAttributeNS(null, "entityID"));
+ if (entityID != null) {
+ builder.addPropertyValue("entityID", entityID);
+ }
+ }
+
+ /**
+ * Parses the key names from the credential configuration.
+ *
+ * @param keyNameElems the elements to parse
+ * @param builder credential build
+ */
+ protected void parseKeyNames(final List<Element> keyNameElems, final BeanDefinitionBuilder builder) {
+ if (keyNameElems == null || keyNameElems.isEmpty()) {
+ return;
+ }
+
+ builder.addPropertyValue("keyNames", SpringSupport.getElementTextContentAsManagedList(keyNameElems));
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractX509CredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractX509CredentialFactoryBean.java
new file mode 100644
index 000000000..786361dd6
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractX509CredentialFactoryBean.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.security.PrivateKey;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+
+import org.opensaml.security.credential.UsageType;
+import org.opensaml.security.crypto.KeySupport;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.BeanCreationException;
+
+/**
+ * A factory bean to collect information to do with an X509 backed {@link BasicX509Credential}.
+ */
+public abstract class AbstractX509CredentialFactoryBean extends AbstractCredentialFactoryBean<BasicX509Credential> {
+
+ /** Log. */
+ private final Logger log = LoggerFactory.getLogger(AbstractX509CredentialFactoryBean.class);
+
+ /** {@inheritDoc} */
+ // Checkstyle: CyclomaticComplexity OFF
+ @Override protected BasicX509Credential doCreateInstance() throws Exception {
+
+ final List<X509Certificate> certificates = getCertificates();
+ if (null == certificates || certificates.isEmpty()) {
+ log.error("{}: No Certificates provided", getConfigDescription());
+ throw new BeanCreationException("No Certificates provided");
+ }
+
+ X509Certificate entityCertificate = getEntityCertificate();
+ if (null == entityCertificate) {
+ entityCertificate = certificates.get(0);
+ }
+
+ final PrivateKey privateKey = getPrivateKey();
+
+ final BasicX509Credential credential;
+ if (null == privateKey) {
+ credential = new BasicX509Credential(entityCertificate);
+ } else {
+ credential = new BasicX509Credential(entityCertificate, privateKey);
+
+ if (!KeySupport.matchKeyPair(entityCertificate.getPublicKey(), privateKey)) {
+ log.error("{}: Public and private keys do not match", getConfigDescription());
+ throw new BeanCreationException("Public and private keys do not match");
+ }
+ }
+
+ credential.setEntityCertificateChain(certificates);
+
+ final List<X509CRL> crls = getCRLs();
+ if (null != crls && !crls.isEmpty()) {
+ credential.setCRLs(crls);
+ }
+
+ if (null != getUsageType()) {
+ credential.setUsageType(UsageType.valueOf(getUsageType()));
+ }
+
+ if (null != getEntityID()) {
+ credential.setEntityId(getEntityID());
+ }
+
+ final List<String> keyNames = getKeyNames();
+ if (null != keyNames) {
+ credential.getKeyNames().addAll(keyNames);
+ }
+
+ return credential;
+ }
+
+ // Checkstyle: CyclomaticComplexity ON
+
+ /** {@inheritDoc} */
+ @Override public Class<BasicX509Credential> getObjectType() {
+ return BasicX509Credential.class;
+ }
+
+ /**
+ * return the explicitly configured entity certificate.
+ *
+ * @return the certificate, or none if not configured.
+ */
+ @Nullable protected abstract X509Certificate getEntityCertificate();
+
+ /**
+ * Get the configured certificates. This <strong>MUST</strong> include the entity certificate if it was configured.
+ *
+ * @return the certificates.
+ */
+
+ @Nonnull @NotEmpty protected abstract List<X509Certificate> getCertificates();
+
+ /**
+ * Get the configured private key.
+ *
+ * @return the key or null if non configured
+ */
+ @Nullable protected abstract PrivateKey getPrivateKey();
+
+ /**
+ * Get the configured CRL list.
+ *
+ * @return the crls or null
+ */
+ @Nullable protected abstract List<X509CRL> getCRLs();
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractX509CredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractX509CredentialParser.java
new file mode 100644
index 000000000..1d5f3c949
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractX509CredentialParser.java
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.xml.namespace.QName;
+
+import net.shibboleth.ext.spring.util.SpringSupport;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.AttributeSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.ManagedList;
+import org.w3c.dom.Element;
+
+/**
+ * Specific parser for all X509Credentials.
+ *
+ * <p>
+ * This does the work of putting the element values into strings. The bean factory then does the correct thing - with
+ * some help from Spring doing auto-conversion.
+ * </p>
+ */
+public abstract class AbstractX509CredentialParser extends AbstractCredentialParser {
+
+ /** <PrivateKey>. */
+ public static final QName PRIVATE_KEY_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "PrivateKey");
+
+ /** <Certificate>. */
+ public static final QName CERTIFICATE_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "Certificate");
+
+ /** <CRL>. */
+ public static final QName CRL_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "CRL");
+
+ /** log. */
+ private Logger log = LoggerFactory.getLogger(AbstractX509CredentialParser.class);
+
+ /** {@inheritDoc} */
+ @Override protected void doParse(final Element element, final BeanDefinitionBuilder builder) {
+ super.doParse(element, builder);
+ parsePrivateKey(ElementSupport.getChildElements(element, PRIVATE_KEY_ELEMENT_NAME), builder);
+ parseCertificates(ElementSupport.getChildElements(element, CERTIFICATE_ELEMENT_NAME), builder);
+ parseCRLs(ElementSupport.getChildElements(element, CRL_ELEMENT_NAME), builder);
+ }
+
+ /**
+ * Parse the <PrivateKey> element.
+ *
+ * @param childElements the elements containing the private key, may be null or empty.
+ * @param builder the builder
+ */
+ private void parsePrivateKey(@Nullable final List<Element> childElements,
+ @Nonnull final BeanDefinitionBuilder builder) {
+ if (null == childElements || childElements.isEmpty()) {
+ return;
+ }
+ if (childElements.size() > 1) {
+ throw new BeanCreationException("More than one <PrivateKey> Elements present.");
+ }
+ final Element key = childElements.get(0);
+ final String value = StringSupport.trimOrNull(key.getTextContent());
+ if (null == value) {
+ throw new BeanCreationException("<PrivateKey> Must contain text.");
+ }
+ log.debug("Found a private key <Supressed>");
+ builder.addPropertyValue("privateKey", value);
+ builder.addPropertyValue("privateKeyPassword", key.getAttributeNS(null, "password"));
+ }
+
+ /**
+ * Parse the <Certificate> elements.
+ *
+ * @param childElements the elements containing the certificates, Must have at least one element.
+ * @param builder the builder
+ */
+ private void parseCertificates(@Nullable final List<Element> childElements,
+ @Nonnull final BeanDefinitionBuilder builder) {
+ if (null == childElements || childElements.isEmpty()) {
+ throw new BeanCreationException("At least one <Certificate> should be present.");
+ }
+
+ final List<String> certs = new ManagedList<>(childElements.size());
+
+ for (final Element elem : childElements) {
+ final String cert = StringSupport.trimOrNull(elem.getTextContent());
+ if (null == cert) {
+ throw new BeanCreationException("All <Certificate> elements must contain text.");
+ }
+ if (elem.hasAttributeNS(null, "entityCertificate")
+ && AttributeSupport.getAttributeValueAsBoolean(elem.getAttributeNodeNS(null,
+ "entityCertificate"))) {
+ // Note the loss of property replacement for this undocumented extension
+ log.debug("Found a certficate marked as an entityCertificate {}", cert);
+ builder.addPropertyValue("entity", cert);
+ } else {
+ log.debug("Found a certficate {}", cert);
+ }
+ certs.add(cert);
+ }
+ builder.addPropertyValue("certificates", certs);
+ }
+
+ /**
+ * Parse the <CRL> elements.
+ *
+ * @param childElements the elements containing the CRLs, Must have at least one element.
+ * @param builder the builder
+ */
+ private void parseCRLs(@Nullable final List<Element> childElements, @Nonnull final BeanDefinitionBuilder builder) {
+ if (null == childElements || childElements.isEmpty()) {
+ return;
+ }
+
+ builder.addPropertyValue("CRLs", SpringSupport.getElementTextContentAsManagedList(childElements));
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicInlineCredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicInlineCredentialFactoryBean.java
new file mode 100644
index 000000000..bac2aebc0
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicInlineCredentialFactoryBean.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.security.KeyException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+
+import javax.annotation.Nullable;
+import javax.crypto.SecretKey;
+
+import org.cryptacular.util.KeyPairUtil;
+import org.opensaml.security.crypto.KeySupport;
+import org.springframework.beans.factory.BeanCreationException;
+
+/**
+ * Factory bean for BasicInline Credentials.
+ */
+public class BasicInlineCredentialFactoryBean extends AbstractBasicCredentialFactoryBean {
+
+ /** Configured public key Info. */
+ @Nullable private byte[] publicKeyInfo;
+
+ /** Configured private key Info. */
+ @Nullable private byte[] privateKeyInfo;
+
+ /** Configured secret key Info. */
+ @Nullable private byte[] secretKeyInfo;
+
+ /**
+ * Get the information used to generate the public key.
+ *
+ * @return Returns the info.
+ */
+ @Nullable public byte[] getPublicKeyInfo() {
+ return publicKeyInfo;
+ }
+
+ /**
+ * Set the information used to generate the public key.
+ *
+ * @param info The info to set.
+ */
+ public void setPublicKeyInfo(@Nullable final byte[] info) {
+ publicKeyInfo = info;
+ }
+
+ /**
+ * Get the information used to generate the private key.
+ *
+ * @return Returns the info.
+ */
+ @Nullable public byte[] getPrivateKeyInfo() {
+ return privateKeyInfo;
+ }
+
+ /**
+ * Set the information used to generate the private key.
+ *
+ * @param info The info to set.
+ */
+ public void setPrivateKeyInfo(@Nullable final byte[] info) {
+ privateKeyInfo = info;
+ }
+
+ /**
+ * Get the information used to generate the secret key.
+ *
+ * @return Returns the info.
+ */
+ @Nullable public byte[] getSecretKeyInfo() {
+ return secretKeyInfo;
+ }
+
+ /**
+ * Set the information used to generate the secret key.
+ *
+ * @param info The info to set.
+ */
+ public void setSecretKeyInfo(@Nullable final byte[] info) {
+ secretKeyInfo = info;
+ }
+
+ /** {@inheritDoc} */
+ @Override @Nullable protected PublicKey getPublicKey() {
+ if (null == getPublicKeyInfo()) {
+ return null;
+ }
+ return KeyPairUtil.decodePublicKey(getPublicKeyInfo());
+ }
+
+ /** {@inheritDoc} */
+ @Override @Nullable protected PrivateKey getPrivateKey() {
+ if (null == getPrivateKeyInfo()) {
+ return null;
+ }
+ return KeyPairUtil.decodePrivateKey(getPrivateKeyInfo(), getPrivateKeyPassword());
+ }
+
+ /** {@inheritDoc} */
+ @Override @Nullable protected SecretKey getSecretKey() {
+ if (null == getSecretKeyInfo()) {
+ return null;
+ }
+ try {
+ return KeySupport.decodeSecretKey(decodeSecretKey(getSecretKeyInfo()), getSecretKeyAlgorithm());
+ } catch (final KeyException e) {
+ throw new BeanCreationException("Could not decode secret key", e);
+ }
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicInlineCredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicInlineCredentialParser.java
new file mode 100644
index 000000000..20d61f76f
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicInlineCredentialParser.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for BasicInline Credentials.
+ */
+public class BasicInlineCredentialParser extends AbstractBasicCredentialParser {
+
+ /** Element Name.*/
+ public static final QName TYPE_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "BasicInline");
+
+ /** {@inheritDoc} */
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return BasicInlineCredentialFactoryBean.class;
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicResourceCredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicResourceCredentialFactoryBean.java
new file mode 100644
index 000000000..f70bcf263
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicResourceCredentialFactoryBean.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.KeyException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+
+import javax.annotation.Nullable;
+import javax.crypto.SecretKey;
+
+import org.cryptacular.util.KeyPairUtil;
+import org.opensaml.security.crypto.KeySupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.core.io.Resource;
+
+import com.google.common.io.ByteStreams;
+
+/**
+ * Spring bean factory for producing a {@link org.opensaml.security.credential.BasicCredential} from {@link Resource}s.
+ */
+public class BasicResourceCredentialFactoryBean extends AbstractBasicCredentialFactoryBean {
+
+ /** log. */
+ private final Logger log = LoggerFactory.getLogger(BasicResourceCredentialFactoryBean.class);
+
+ /** Configured public key Info. */
+ @Nullable private Resource publicKeyInfo;
+
+ /** Configured private key Info. */
+ @Nullable private Resource privateKeyInfo;
+
+ /** Configured secret key Info. */
+ @Nullable private Resource secretKeyInfo;
+
+ /**
+ * Get the information used to generate the public key.
+ *
+ * @return Returns the info.
+ */
+ @Nullable public Resource getPublicKeyInfo() {
+ return publicKeyInfo;
+ }
+
+ /**
+ * Set the information used to generate the public key.
+ *
+ * @param info The info to set.
+ */
+ public void setPublicKeyInfo(@Nullable final Resource info) {
+ publicKeyInfo = info;
+ }
+
+ /**
+ * Get the information used to generate the private key.
+ *
+ * @return Returns the info.
+ */
+ @Nullable public Resource getPrivateKeyInfo() {
+ return privateKeyInfo;
+ }
+
+ /**
+ * Set the information used to generate the private key.
+ *
+ * @param info The info to set.
+ */
+ public void setPrivateKeyInfo(@Nullable final Resource info) {
+ privateKeyInfo = info;
+ }
+
+ /**
+ * Get the information used to generate the secret key.
+ *
+ * @return Returns the info.
+ */
+ @Nullable public Resource getSecretKeyInfo() {
+ return secretKeyInfo;
+ }
+
+ /**
+ * Set the information used to generate the secret key.
+ *
+ * @param info The info to set.
+ */
+ public void setSecretKeyInfo(@Nullable final Resource info) {
+ secretKeyInfo = info;
+ }
+
+ /** {@inheritDoc} */
+ @Override @Nullable protected PublicKey getPublicKey() {
+ if (null == getPublicKeyInfo()) {
+ return null;
+ }
+ try (InputStream is = getPublicKeyInfo().getInputStream()) {
+ return KeyPairUtil.readPublicKey(is);
+ } catch (final IOException e) {
+ log.error("{}: Could not decode public key: {}", getConfigDescription(), e.getMessage());
+ throw new BeanCreationException("Could not decode public key", e);
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override @Nullable protected PrivateKey getPrivateKey() {
+ if (null == getPrivateKeyInfo()) {
+ return null;
+ }
+ try (InputStream is = getPrivateKeyInfo().getInputStream()) {
+ return KeySupport.decodePrivateKey(is, getPrivateKeyPassword());
+ } catch (final KeyException | IOException e) {
+ log.error("{}: Could not decode private key: {}", getConfigDescription(), e.getMessage());
+ throw new BeanCreationException("Could not decode private key", e);
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override @Nullable protected SecretKey getSecretKey() {
+ if (null == getSecretKeyInfo()) {
+ return null;
+ }
+ try (InputStream is = getSecretKeyInfo().getInputStream()) {
+ return KeySupport.decodeSecretKey(decodeSecretKey(ByteStreams.toByteArray(is)), getSecretKeyAlgorithm());
+ } catch (final KeyException | IOException e) {
+ log.error("{}: Could not decode secret key: {}", getConfigDescription(), e.getMessage());
+ throw new BeanCreationException("Could not decode secret key", e);
+ }
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicResourceCredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicResourceCredentialParser.java
new file mode 100644
index 000000000..f60d1ec8d
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicResourceCredentialParser.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for BasicFilesystem and BasicResourceBacked Credentials.
+ */
+public class BasicResourceCredentialParser extends AbstractBasicCredentialParser {
+
+ /** Type for Resource. */
+ public static final QName TYPE_NAME_RESOURCE = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "BasicResourceBacked");
+
+ /** {@inheritDoc} */
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return BasicResourceCredentialFactoryBean.class;
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicX509CredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicX509CredentialFactoryBean.java
new file mode 100644
index 000000000..bbacc69e4
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicX509CredentialFactoryBean.java
@@ -0,0 +1,224 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.KeyException;
+import java.security.PrivateKey;
+import java.security.cert.CRLException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.collection.LazyList;
+
+import org.opensaml.security.crypto.KeySupport;
+import org.opensaml.security.x509.X509Support;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.core.io.Resource;
+
+/**
+ * Spring bean factory for producing a {@link org.opensaml.security.x509.BasicX509Credential} from {@link Resource}s.
+ *
+ * <p>
+ * This factory bean supports DER and PEM encoded certificate resources and encrypted and non-encrypted PKCS8, DER, or
+ * PEM encoded private key resources.
+ * </p>
+ */
+public class BasicX509CredentialFactoryBean extends AbstractX509CredentialFactoryBean {
+
+ /** log. */
+ private final Logger log = LoggerFactory.getLogger(BasicX509CredentialFactoryBean.class);
+
+ /** The specification of where the entity Resource is to be found. */
+ private Resource entityResource;
+
+ /** Where the certificates are to be found. */
+ private List<Resource> certificateResources;
+
+ /** Where the private key is to be found. */
+ private Resource privateKeyResource;
+
+ /** Where the crls are to be found. */
+ private List<Resource> crlResources;
+
+ /**
+ * Set the Resource with the entity certificate.
+ *
+ * @param what The Resource to set.
+ */
+ public void setEntity(@Nonnull final Resource what) {
+ entityResource = what;
+ }
+
+ /**
+ * Sets the Resources which contain the certificates.
+ *
+ * @param what The values to set.
+ */
+ public void setCertificates(@Nullable @NotEmpty final List<Resource> what) {
+ certificateResources = what;
+ }
+
+ /**
+ * Set the Resource with the entity certificate.
+ *
+ * @param what The resource to set.
+ */
+ public void setPrivateKey(@Nullable final Resource what) {
+ privateKeyResource = what;
+ }
+
+ /**
+ * Sets the Resources which contain the crls.
+ *
+ * @param what The value to set.
+ */
+ public void setCRLs(@Nullable @NotEmpty final List<Resource> what) {
+ crlResources = what;
+ }
+
+ //
+ // BasicX509CredentialFactoryBean
+ //
+ /**
+ * Set the resource containing the private key.
+ *
+ * @param res private key resource, never <code>null</code>
+ */
+ public void setPrivateKeyResource(@Nonnull final Resource res) {
+ setPrivateKey(res);
+ }
+
+ /**
+ * Set the password for the private key.
+ *
+ * @param password password for the private key, may be null if the key is not encrypted
+ */
+ public void setPrivateKeyPassword(@Nullable final String password) {
+ setPrivateKeyPassword(password.toCharArray());
+ }
+
+ /**
+ * Set the certificate resource.
+ *
+ * @param res certificate resource
+ */
+ public void setCertificateResource(@Nonnull final Resource res) {
+ setCertificates(Collections.singletonList(res));
+ }
+
+ /**
+ * Set the entityID for the credential.
+ *
+ * @param id entityID
+ */
+ public void setEntityId(@Nullable final String id) {
+ setEntityID(id);
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSingleton() {
+ return true;
+ }
+
+ /** {@inheritDoc}. */
+ @Override @Nullable protected X509Certificate getEntityCertificate() {
+
+ if (null == entityResource) {
+ return null;
+ }
+ try {
+ final Collection<X509Certificate> certs = X509Support.decodeCertificates(entityResource.getInputStream());
+ if (certs.size() > 1) {
+ log.error("{}: Configuration element indicated an entityCertificate,"
+ + " but multiple certificates were decoded", getConfigDescription());
+ throw new FatalBeanException("Configuration element indicated an entityCertificate,"
+ + " but multiple certificates were decoded");
+ }
+ return certs.iterator().next();
+ } catch (final CertificateException | IOException e) {
+ log.error("{}: Could not decode provided Entity Certificate at {}: {}", getConfigDescription(),
+ entityResource.getDescription(), e.getMessage());
+ throw new FatalBeanException("Could not decode provided Entity Certificate file "
+ + entityResource.getDescription(), e);
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override @Nonnull protected List<X509Certificate> getCertificates() {
+
+ if (certificateResources == null) {
+ return Collections.emptyList();
+ }
+
+ final List<X509Certificate> certificates = new LazyList<>();
+ for (final Resource r : certificateResources) {
+ try(InputStream is = r.getInputStream()) {
+ certificates.addAll(X509Support.decodeCertificates(is));
+ } catch (final CertificateException | IOException e) {
+ log.error("{}: could not decode CertificateFile at {}: {}", getConfigDescription(),
+ r.getDescription(), e.getMessage());
+ throw new FatalBeanException("Could not decode provided CertificateFile: " + r.getDescription(), e);
+ }
+ }
+ return certificates;
+ }
+
+ /** {@inheritDoc} */
+ @Override @Nullable protected PrivateKey getPrivateKey() {
+ if (null == privateKeyResource) {
+ return null;
+ }
+ try (InputStream is = privateKeyResource.getInputStream()) {
+ return KeySupport.decodePrivateKey(is, getPrivateKeyPassword());
+ } catch (final KeyException | IOException e) {
+ log.error("{}: Could not decode KeyFile at {}: {}", getConfigDescription(),
+ privateKeyResource.getDescription(), e.getMessage());
+ throw new FatalBeanException("Could not decode provided KeyFile " + privateKeyResource.getDescription(), e);
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override @Nullable protected List<X509CRL> getCRLs() {
+ if (null == crlResources) {
+ return null;
+ }
+ final List<X509CRL> crls = new LazyList<>();
+ for (final Resource crl : crlResources) {
+ try (InputStream is = crl.getInputStream()) {
+ crls.addAll(X509Support.decodeCRLs(is));
+ } catch (final CRLException | IOException e) {
+ log.error("{}: Could not decode CRL file at {}: {}", getConfigDescription(), crl.getDescription(),
+ e.getMessage());
+ throw new FatalBeanException("Could not decode provided CRL file " + crl.getDescription(), e);
+ }
+ }
+ return crls;
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509InlineCredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509InlineCredentialFactoryBean.java
new file mode 100644
index 000000000..f5f1b80de
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509InlineCredentialFactoryBean.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.security.PrivateKey;
+import java.security.cert.CRLException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.collection.LazyList;
+
+import org.cryptacular.util.KeyPairUtil;
+import org.opensaml.security.x509.X509Support;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.FatalBeanException;
+
+/**
+ * A factory bean to understand X509Inline credentials.
+ */
+public class X509InlineCredentialFactoryBean extends AbstractX509CredentialFactoryBean {
+
+ /** log. */
+ private final Logger log = LoggerFactory.getLogger(X509InlineCredentialFactoryBean.class);
+
+ /** The entity certificate. */
+ private String entityCertificate;
+
+ /** The certificates. */
+ private List<String> certificates;
+
+ /** The private key. */
+ private byte[] privateKey;
+
+ /** The crls. */
+ private List<String> crls;
+
+ /**
+ * Set the file with the entity certificate.
+ *
+ * @param entityCert The file to set.
+ */
+ public void setEntity(@Nonnull final String entityCert) {
+ entityCertificate = entityCert;
+ }
+
+ /**
+ * Sets the certificates.
+ *
+ * @param certs The value to set.
+ */
+ public void setCertificates(@Nullable @NotEmpty final List<String> certs) {
+ certificates = certs;
+ }
+
+ /**
+ * Set the private key.
+ *
+ * @param key The file to set.
+ */
+ public void setPrivateKey(@Nullable final byte[] key) {
+ privateKey = key;
+ }
+
+ /**
+ * Sets the files which contain the crls.
+ *
+ * @param list The value to set.
+ */
+ public void setCRLs(@Nullable @NotEmpty final List<String> list) {
+ crls = list;
+ }
+
+ /** {@inheritDoc}. */
+ @Override @Nullable protected X509Certificate getEntityCertificate() {
+
+ if (null == entityCertificate) {
+ return null;
+ }
+ try {
+ return X509Support.decodeCertificate(entityCertificate);
+ } catch (final CertificateException e) {
+ log.error("{}: Could not decode provided Entity Certificate: {}", getConfigDescription(), e.getMessage());
+ throw new FatalBeanException("Could not decode provided Entity Certificate", e);
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override @Nonnull protected List<X509Certificate> getCertificates() {
+ final List<X509Certificate> certs = new LazyList<>();
+ for (final String cert : certificates) {
+ try {
+ certs.add(X509Support.decodeCertificate(cert.trim()));
+ } catch (final CertificateException e) {
+ log.error("{}: Could not decode provided Certificate: {}", getConfigDescription(), e.getMessage());
+ throw new FatalBeanException("Could not decode provided Certificate", e);
+ }
+ }
+ return certs;
+ }
+
+ /** {@inheritDoc} */
+ @Override @Nullable protected PrivateKey getPrivateKey() {
+ if (null == privateKey) {
+ return null;
+ }
+ return KeyPairUtil.decodePrivateKey(privateKey, getPrivateKeyPassword());
+ }
+
+ /** {@inheritDoc} */
+ @Override @Nullable protected List<X509CRL> getCRLs() {
+ if (null == crls) {
+ return null;
+ }
+ final List<X509CRL> result = new LazyList<>();
+ for (final String crl : crls) {
+ try {
+ result.add(X509Support.decodeCRL(crl));
+ } catch (final CRLException | CertificateException e) {
+ log.error("{}: Could not decode provided CRL: {}", getConfigDescription(), e.getMessage());
+ throw new FatalBeanException("Could not decode provided CRL", e);
+ }
+ }
+ return result;
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509InlineCredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509InlineCredentialParser.java
new file mode 100644
index 000000000..59450f9b2
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509InlineCredentialParser.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for X509Inline credentials.
+ */
+public class X509InlineCredentialParser extends AbstractX509CredentialParser {
+
+ /** Element Name.*/
+ public static final QName TYPE_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "X509Inline");
+
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return X509InlineCredentialFactoryBean.class;
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509ResourceCredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509ResourceCredentialParser.java
new file mode 100644
index 000000000..886e836bc
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509ResourceCredentialParser.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for X509Filesystem credentials.
+ */
+public class X509ResourceCredentialParser extends AbstractX509CredentialParser {
+
+ /** Type for X509 credentials. */
+ public static final QName TYPE_NAME_RESOURCE = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "X509ResourceBacked");
+
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return BasicX509CredentialFactoryBean.class;
+ }
+
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/package-info.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/package-info.java
new file mode 100644
index 000000000..b599cb5e9
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Factory beans for various credential classes.
+ */
+
+package org.opensaml.spring.credential;
\ No newline at end of file
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/package-info.java b/opensaml-spring/src/main/java/org/opensaml/spring/package-info.java
new file mode 100644
index 000000000..de8c5e25e
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Supporting classes for Spring support.
+ */
+
+package org.opensaml.spring;
\ No newline at end of file
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractBasicPKIXValidationInfoFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractBasicPKIXValidationInfoFactoryBean.java
new file mode 100644
index 000000000..97d0a8f18
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractBasicPKIXValidationInfoFactoryBean.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
+
+import org.opensaml.security.x509.impl.BasicPKIXValidationInformation;
+
+/**
+ * A factory bean to collect information to do with a {@link BasicPKIXValidationInformation}.
+ */
+public abstract class AbstractBasicPKIXValidationInfoFactoryBean extends
+ AbstractComponentAwareFactoryBean<BasicPKIXValidationInformation> {
+
+ /** Verification depth. */
+ @Nullable private Integer verifyDepth;
+
+ /** The description of the file with the configuration us. */
+ @Nonnull private String configDescription;
+
+ /**
+ * Get the verify Depth.
+ *
+ * @return Returns the depth.
+ */
+ public int getVerifyDepth() {
+ return verifyDepth;
+ }
+
+ /**
+ * Set the verify Depth.
+ *
+ * @param depth The value to set.
+ */
+ public void setVerifyDepth(final int depth) {
+ verifyDepth = depth;
+ }
+
+ /**
+ * For logging, get the description of the resource that defined this bean.
+ *
+ * @return Returns the description.
+ */
+ public String getConfigDescription() {
+ return configDescription;
+ }
+
+ /**
+ * For logging, set the description of the resource that defined this bean.
+ *
+ * @param desc what to set.
+ */
+ public void setConfigDescription(@Nonnull final String desc) {
+ configDescription = desc;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Class<?> getObjectType() {
+ return BasicPKIXValidationInformation.class;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected BasicPKIXValidationInformation doCreateInstance() throws Exception {
+ return new BasicPKIXValidationInformation(getCertificates(), getCRLs(), verifyDepth);
+ }
+
+ /**
+ * Get the configured certificates.
+ *
+ * @return the certificates.
+ */
+ @Nullable protected abstract List<X509Certificate> getCertificates();
+
+ /**
+ * Get the configured CRL list.
+ *
+ * @return the crls or null
+ */
+ @Nullable protected abstract List<X509CRL> getCRLs();
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractChainingParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractChainingParser.java
new file mode 100644
index 000000000..a45782572
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractChainingParser.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.List;
+
+import net.shibboleth.ext.spring.util.SpringSupport;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.BeanMetadataElement;
+import org.springframework.beans.factory.config.RuntimeBeanReference;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.ManagedList;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Base Parser for trust engines of type SignatureChaining and Chaining.
+ */
+public abstract class AbstractChainingParser extends AbstractTrustEngineParser {
+
+ /** {@inheritDoc} */
+ @Override protected void doParse(final Element element, final ParserContext parserContext,
+ final BeanDefinitionBuilder builder) {
+ super.doParse(element, parserContext, builder);
+
+ final List<Element> childEngines =
+ ElementSupport.getChildElements(element, SecurityNamespaceHandler.TRUST_ENGINE_ELEMENT_NAME);
+ final List<Element> childEngineRefs =
+ ElementSupport.getChildElements(element, SecurityNamespaceHandler.TRUST_ENGINE_REF);
+
+ final List<BeanMetadataElement> allChildren = new ManagedList<>(childEngines.size()+ childEngineRefs.size());
+
+ allChildren.addAll(SpringSupport.parseCustomElements(childEngines, parserContext, builder));
+
+ for (final Element ref:childEngineRefs) {
+ final String reference = StringSupport.trimOrNull(ref.getAttributeNS(null, "ref"));
+ if (null != reference) {
+ allChildren.add(new RuntimeBeanReference(StringSupport.trim(reference)));
+ }
+ }
+ builder.addConstructorArgValue(allChildren);
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractPKIXValidationInfoParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractPKIXValidationInfoParser.java
new file mode 100644
index 000000000..4f0757e02
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractPKIXValidationInfoParser.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.ManagedList;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+import net.shibboleth.ext.spring.util.AbstractCustomBeanDefinitionParser;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+/**
+ * Base parser for all <ValidationInfo> types. This does all the heavy lifting of creating lists of strings from
+ * the sub-elements. The derived classes specify which factory bean to create and that in turn converts from string to
+ * CRL or Certificate (either inline or from a file).
+ */
+public abstract class AbstractPKIXValidationInfoParser extends AbstractCustomBeanDefinitionParser {
+
+ /** The element <Certificate>. */
+ private static final QName CERTIFICATE =
+ new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "Certificate");
+
+ /** The element <CRL>. */
+ private static final QName CRL = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "CRL");
+
+ /** {@inheritDoc} */
+ @Override protected void doParse(final Element element, final ParserContext parserContext,
+ final BeanDefinitionBuilder builder) {
+ super.doParse(element, parserContext, builder);
+
+ builder.addPropertyValue("configDescription", parserContext.getReaderContext().getResource().getDescription());
+
+ if (element.hasAttributeNS(null, "verifyDepth")) {
+ builder.addPropertyValue("verifyDepth",
+ StringSupport.trimOrNull(element.getAttributeNS(null, "verifyDepth")));
+ }
+
+ final List<Element> certificates = ElementSupport.getChildElements(element, CERTIFICATE);
+ final List<String> certStrings = new ManagedList<>(certificates.size());
+
+ for (final Element cert : certificates) {
+ certStrings.add(cert.getTextContent());
+ }
+
+ builder.addPropertyValue("certificates", certStrings);
+
+ final List<Element> crls = ElementSupport.getChildElements(element, CRL);
+ final List<String> crlStrings = new ManagedList<>(certificates.size());
+
+ for (final Element crl : crls) {
+ crlStrings.add(crl.getTextContent());
+ }
+
+ builder.addPropertyValue("CRLs", crlStrings);
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractStaticPKIXParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractStaticPKIXParser.java
new file mode 100644
index 000000000..e8e70bb9f
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractStaticPKIXParser.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.xml.namespace.QName;
+
+import net.shibboleth.ext.spring.util.SpringSupport;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.security.x509.impl.BasicX509CredentialNameEvaluator;
+import org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator;
+import org.opensaml.security.x509.impl.StaticPKIXValidationInformationResolver;
+import org.opensaml.security.x509.impl.X509CredentialNameEvaluator;
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.config.AbstractFactoryBean;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Base Parser for trust engines of type StaticPKIXKeySignature and StaticPKIXX509Credential.
+ */
+public abstract class AbstractStaticPKIXParser extends AbstractTrustEngineParser {
+
+ /** Validation Information. */
+ public static final QName VALIDATION_INFO = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "ValidationInfo");
+
+ /** Trusted Names Information. */
+ public static final QName TRUSTED_NAMES = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "TrustedName");
+
+ /**
+ * Get the definition for the {@link org.opensaml.security.x509.PKIXValidationInformationResolver}. This is
+ * constructed from the Trusted names and the Validation Info.
+ *
+ * @param element what to parse
+ * @param parserContext the context to parse inside
+ * @return the definition
+ */
+ protected BeanDefinition getPKIXValidationInformationResolver(@Nonnull final Element element,
+ @Nonnull final ParserContext parserContext) {
+
+ final List<Element> validationInfoElements = ElementSupport.getChildElements(element, VALIDATION_INFO);
+ final List<Element> trustedNameElements = ElementSupport.getChildElements(element, TRUSTED_NAMES);
+
+ final BeanDefinitionBuilder builder =
+ BeanDefinitionBuilder.genericBeanDefinition(StaticPKIXValidationInformationResolver.class);
+ builder.addConstructorArgValue(
+ SpringSupport.parseCustomElements(validationInfoElements, parserContext, builder));
+ builder.addConstructorArgValue(
+ SpringSupport.getElementTextContentAsManagedList(trustedNameElements));
+
+ return builder.getBeanDefinition();
+ }
+
+ /**
+ * Get the definition for the {@link org.opensaml.security.x509.PKIXTrustEvaluator}. This is purely a
+ * {@link CertPathPKIXTrustEvaluator} constructed with whatever ValidationOptions we provide.
+ *
+ * @param element what to parse
+ * @param parserContext the context to parse inside
+ * @return the definition
+ */
+ protected BeanDefinition getPKIXTrustEvaluator(@Nonnull final Element element,
+ @Nonnull final ParserContext parserContext) {
+
+ final BeanDefinitionBuilder builder =
+ BeanDefinitionBuilder.genericBeanDefinition(CertPathPKIXTrustEvaluator.class);
+
+ final List<Element> validationOptionsElements =
+ ElementSupport.getChildElements(element, PKIXValidationOptionsParser.ELEMENT_NAME);
+
+ if (null != validationOptionsElements && !validationOptionsElements.isEmpty()) {
+ builder.addConstructorArgValue(
+ SpringSupport.parseCustomElements(validationOptionsElements, parserContext, builder));
+ }
+ return builder.getBeanDefinition();
+ }
+
+ /**
+ * Get the effective X509CredentialNameEvaluator to use. Currently we return a literal value, but in the future a
+ * BeanDefinition could be returned if necessary if we support toggling the name evaluator settings, hence the
+ * Object return type.
+ *
+ * @param element what to parse
+ * @param parserContext the context to parse inside
+ * @return an X509CredentialNameEvaluator instance or a BeanDefinition. May be null.
+ */
+ protected Object getX509CredentialNameEvaluator(@Nonnull final Element element,
+ @Nonnull final ParserContext parserContext) {
+
+ final BeanDefinitionBuilder builder =
+ BeanDefinitionBuilder.genericBeanDefinition(X509CredentialNameEvaluatorFactoryBean.class);
+ final String attrValue = StringSupport.trimOrNull(element.getAttributeNS(null, "trustedNameCheckEnabled"));
+ if (attrValue != null) {
+ builder.addPropertyValue("trustedNameCheckEnabled", attrValue);
+ }
+ return builder.getBeanDefinition();
+ }
+
+ /**
+ * FactoryBean to do a deferred decision on whether to create a {@link X509CredentialNameEvaluator}. This is in a
+ * factory bean to allow for property replacement. The default (no value setting) is true.
+ */
+ protected static class X509CredentialNameEvaluatorFactoryBean extends
+ AbstractFactoryBean<X509CredentialNameEvaluator> {
+
+ /** Do we emit a {@link X509CredentialNameEvaluator} or not. */
+ private boolean trustedNameCheckEnabled = true;
+
+ /**
+ * Set whether to perform the trusted name check.
+ *
+ * @param enabled whether we emit a {@link X509CredentialNameEvaluator} .
+ */
+ public void setTrustedNameCheckEnabled(final boolean enabled) {
+ trustedNameCheckEnabled = enabled;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Class<?> getObjectType() {
+ return BasicX509CredentialNameEvaluator.class;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected BasicX509CredentialNameEvaluator createInstance() throws Exception {
+ if (trustedNameCheckEnabled) {
+ return new BasicX509CredentialNameEvaluator();
+ }
+ return null;
+ }
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractTrustEngineParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractTrustEngineParser.java
new file mode 100644
index 000000000..62401ab70
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractTrustEngineParser.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+import net.shibboleth.ext.spring.util.AbstractCustomBeanDefinitionParser;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+
+/**
+ * Basis of all parsers for <security:TrustEngine>.
+ */
+public abstract class AbstractTrustEngineParser extends AbstractCustomBeanDefinitionParser {
+
+ /** {@inheritDoc} */
+ @Override protected String resolveId(final Element element, final AbstractBeanDefinition definition,
+ final ParserContext parserContext) {
+ return StringSupport.trimOrNull(element.getAttributeNS(null, "id"));
+ }
+
+ @Override protected void doParse(final Element element, final ParserContext parserContext,
+ final BeanDefinitionBuilder builder) {
+ super.doParse(element, parserContext, builder);
+ builder.setLazyInit(true);
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/CertPathPKIXValidationOptionsParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/CertPathPKIXValidationOptionsParser.java
new file mode 100644
index 000000000..1afb52949
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/CertPathPKIXValidationOptionsParser.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.security.x509.impl.CertPathPKIXValidationOptions;
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.ManagedList;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Spring bean definition parser for {urn:mace:shibboleth:2.0:security}ValidationOptions elements which have a type
+ * specialization of {urn:mace:shibboleth:2.0:security}CertPathValidationOptionsType.
+ */
+public class CertPathPKIXValidationOptionsParser extends PKIXValidationOptionsParser {
+ /** Schema type. */
+ public static final QName SCHEMA_TYPE = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "CertPathValidationOptionsType");
+
+ /** PolicyOid Element type. */
+ public static final QName POLICY_OID_ELEMENT = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "PolicyOID");
+
+ /** {@inheritDoc} */
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return CertPathPKIXValidationOptions.class;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void doParse(final Element element, final ParserContext parserContext,
+ final BeanDefinitionBuilder builder) {
+ super.doParse(element, parserContext, builder);
+
+ if (element.hasAttributeNS(null, "forceRevocationEnabled")) {
+ builder.addPropertyValue("forceRevocationEnabled",
+ StringSupport.trimOrNull(element.getAttributeNS(null, "forceRevocationEnabled")));
+ }
+
+ if (element.hasAttributeNS(null, "revocationEnabled")) {
+ builder.addPropertyValue("revocationEnabled",
+ StringSupport.trimOrNull(element.getAttributeNS(null, "revocationEnabled")));
+ }
+
+ if (element.hasAttributeNS(null, "policyMappingInhibit")) {
+ builder.addPropertyValue("policyMappingInhibit",
+ StringSupport.trimOrNull(element.getAttributeNS(null, "policyMappingInhibit")));
+ }
+
+ if (element.hasAttributeNS(null, "anyPolicyInhibit")) {
+ builder.addPropertyValue("anyPolicyInhibit",
+ StringSupport.trimOrNull(element.getAttributeNS(null, "anyPolicyInhibit")));
+ }
+
+ final List<Element> childElems = ElementSupport.getChildElements(element, POLICY_OID_ELEMENT);
+ if (null != childElems && !childElems.isEmpty()) {
+ final List<String> initialPolicies = new ManagedList<>(childElems.size());
+ for (final Element nameElem : childElems) {
+ final String value = StringSupport.trimOrNull(nameElem.getTextContent());
+ if (null != value) {
+ initialPolicies.add(value);
+ }
+ }
+ builder.addPropertyValue("initialPolicies", initialPolicies);
+ }
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingParser.java
new file mode 100644
index 000000000..eb8095519
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingParser.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for trust engines of type SignatureChaining.
+ */
+public class ChainingParser extends AbstractChainingParser {
+
+ /** Schema type. */
+ public static final QName TYPE_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "Chaining");
+
+ /** {@inheritDoc} */
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return ChainingTrustEngineFactory.class;
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingSignatureTrustEngineFactory.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingSignatureTrustEngineFactory.java
new file mode 100644
index 000000000..60fc228d1
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingSignatureTrustEngineFactory.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+
+import org.opensaml.xmlsec.signature.support.SignatureTrustEngine;
+import org.opensaml.xmlsec.signature.support.impl.ChainingSignatureTrustEngine;
+
+/**
+ * Factory bean for {@link ChainingSignatureTrustEngine}. This finesses the issue that some parsers are not supported
+ * and return a bean of type object and these cannot be injected into the trust engine. This factory just filters the
+ * unsupported engines out. A warning has been issued at point of parse so no further logging is required.
+ */
+public class ChainingSignatureTrustEngineFactory extends
+ AbstractComponentAwareFactoryBean<ChainingSignatureTrustEngine> {
+
+ /** The unfiltered list of putative trust engines. */
+ private final List<Object> engines;
+
+ /**
+ * Constructor.
+ *
+ * @param list the putative trust engines.
+ */
+ public ChainingSignatureTrustEngineFactory(@Nonnull final List<Object> list) {
+ engines = Constraint.isNotNull(list, "Engine list must be non null");
+ }
+
+ /** {@inheritDoc} */
+ @Override public Class<?> getObjectType() {
+ return ChainingSignatureTrustEngine.class;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected ChainingSignatureTrustEngine doCreateInstance() throws Exception {
+ final List<SignatureTrustEngine> list = new ArrayList<>(engines.size());
+
+ for (final Object engine : engines) {
+ if (engine instanceof SignatureTrustEngine) {
+ list.add((SignatureTrustEngine) engine);
+
+ }
+ }
+ return new ChainingSignatureTrustEngine(list);
+ }
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingTrustEngineFactory.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingTrustEngineFactory.java
new file mode 100644
index 000000000..6f388c08b
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingTrustEngineFactory.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+
+import org.opensaml.security.trust.TrustEngine;
+import org.opensaml.security.trust.impl.ChainingTrustEngine;
+
+/**
+ * Factory bean for {@link ChainingTrustEngine}. This finesses the issue that some parsers are not supported
+ * and return a bean of type object and these cannot be injected into the trust engine. This factory just filters the
+ * unsupported engines out. A warning has been issued at point of parse so no further logging is required.
+ */
+public class ChainingTrustEngineFactory extends
+ AbstractComponentAwareFactoryBean<ChainingTrustEngine<?>> {
+
+ /** The unfiltered list of putative trust engines. */
+ private final List<Object> engines;
+
+ /**
+ * Constructor.
+ *
+ * @param list the putative trust engines.
+ */
+ public ChainingTrustEngineFactory(@Nonnull final List<Object> list) {
+ engines = Constraint.isNotNull(list, "Engine list must be non null");
+ }
+
+ /** {@inheritDoc} */
+ @Override public Class<?> getObjectType() {
+ return ChainingTrustEngine.class;
+ }
+
+ /** {@inheritDoc} */
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ @Override protected ChainingTrustEngine<?> doCreateInstance() throws Exception {
+ final List<TrustEngine<?>> list = new ArrayList<>(engines.size());
+
+ for (final Object engine : engines) {
+ if (engine instanceof TrustEngine) {
+ list.add((TrustEngine<?>) engine);
+
+ }
+ }
+ return new ChainingTrustEngine(list);
+ }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXInlineValidationInfoFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXInlineValidationInfoFactoryBean.java
new file mode 100644
index 000000000..36f4ec0ce
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXInlineValidationInfoFactoryBean.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.security.cert.CRLException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import org.opensaml.security.x509.X509Support;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.FatalBeanException;
+
+/**
+ * File system specific bean for PKIXValidationInfo.
+ */
+public class PKIXInlineValidationInfoFactoryBean extends AbstractBasicPKIXValidationInfoFactoryBean {
+
+ /** log. */
+ private Logger log = LoggerFactory.getLogger(PKIXInlineValidationInfoFactoryBean.class);
+
+ /** The strings to be turned into the certificates. */
+ private List<String> certificateFiles;
+
+ /** The strings to be turned into the crls. */
+ private List<String> crlStrings;
+
+ /**
+ * Set the file names which we will convert into certificates.
+ *
+ * @param certs the file names.
+ */
+ public void setCertificates(@Nullable final List<String> certs) {
+ certificateFiles = certs;
+ }
+
+ /**
+ * Set the file names which we will convert into crls.
+ *
+ * @param crls the file names.
+ */
+ public void setCRLs(@Nullable final List<String> crls) {
+ crlStrings = crls;
+ }
+
+ /**
+ * Get the configured certificates.
+ *
+ * @return the certificates null
+ */
+ @Override @Nullable protected List<X509Certificate> getCertificates() {
+ if (null == certificateFiles) {
+ return null;
+ }
+ final List<X509Certificate> certificates = new ArrayList<>(certificateFiles.size());
+ for (final String cert : certificateFiles) {
+ try {
+ certificates.add(X509Support.decodeCertificate(cert.trim()));
+ } catch (final CertificateException e) {
+ log.error("{}: Could not decode provided Certificate: {}", getConfigDescription(), e.getMessage());
+ throw new FatalBeanException("Could not decode provided Certificate", e);
+ }
+ }
+ return certificates;
+ }
+
+ /**
+ * Get the configured CRL list.
+ *
+ * @return the crls or null
+ */
+ @Override @Nullable protected List<X509CRL> getCRLs() {
+ if (null == crlStrings) {
+ return null;
+ }
+ final List<X509CRL> crls = new ArrayList<>(crlStrings.size());
+ for (final String crl : crlStrings) {
+ try {
+ crls.add(X509Support.decodeCRL(crl));
+ } catch (final CRLException | CertificateException e) {
+ log.error("{}: Could not decode provided CRL: {}", getConfigDescription(), e.getMessage());
+ throw new FatalBeanException("Could not decode provided CRL", e);
+ }
+ }
+ return crls;
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXInlineValidationInfoParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXInlineValidationInfoParser.java
new file mode 100644
index 000000000..b723ef00e
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXInlineValidationInfoParser.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for <ValidationInfo type="PKIXInline">.
+ *
+ * <p>
+ * All of the heavy lifting is done in the super class and the associated factory bean (which gets the parameters of
+ * the type is wants by virtue of Springs type coercion).
+ * </p>
+ */
+public class PKIXInlineValidationInfoParser extends AbstractPKIXValidationInfoParser {
+
+ /** Element Name.*/
+ public static final QName SCHEMA_TYPE = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "PKIXInline");
+
+ /** {@inheritDoc} */
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return PKIXInlineValidationInfoFactoryBean.class;
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXResourceValidationInfoFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXResourceValidationInfoFactoryBean.java
new file mode 100644
index 000000000..52371d63e
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXResourceValidationInfoFactoryBean.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.cert.CRLException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import org.opensaml.security.x509.X509Support;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.core.io.Resource;
+
+/**
+ * File system specific bean for PKIXValidationInfo.
+ */
+public class PKIXResourceValidationInfoFactoryBean extends AbstractBasicPKIXValidationInfoFactoryBean {
+
+ /** log. */
+ private Logger log = LoggerFactory.getLogger(PKIXResourceValidationInfoFactoryBean.class);
+
+ /** The file to be turned into the certificates. */
+ private List<Resource> certificateFiles;
+
+ /** The file to be turned into the crls. */
+ private List<Resource> crlFiles;
+
+ /**
+ * Set the file names which we will convert into certificates.
+ *
+ * @param certs the file names.
+ */
+ public void setCertificates(@Nullable final List<Resource> certs) {
+ certificateFiles = certs;
+ }
+
+ /**
+ * Set the file names which we will convert into crls.
+ *
+ * @param crls the file names.
+ */
+ public void setCRLs(@Nullable final List<Resource> crls) {
+ crlFiles = crls;
+ }
+
+ /**
+ * Get the configured certificates.
+ *
+ * @return the certificates null
+ */
+ @Override @Nullable protected List<X509Certificate> getCertificates() {
+ if (null == certificateFiles) {
+ return null;
+ }
+ final List<X509Certificate> certificates = new ArrayList<>(certificateFiles.size());
+ for (final Resource f : certificateFiles) {
+ try(InputStream is = f.getInputStream()) {
+ certificates.addAll(X509Support.decodeCertificates(is));
+ } catch (final CertificateException | IOException e) {
+ log.error("{}: Could not decode Certificate at {}: {}", getConfigDescription(), f.getDescription(),
+ e.getMessage());
+ throw new FatalBeanException("Could not decode provided CertificateFile: " + f.getDescription(), e);
+ }
+ }
+ return certificates;
+ }
+
+ /**
+ * Get the configured CRL list.
+ *
+ * @return the crls or null
+ */
+ @Override @Nullable protected List<X509CRL> getCRLs() {
+ if (null == crlFiles) {
+ return null;
+ }
+ final List<X509CRL> crls = new ArrayList<>(crlFiles.size());
+ for (final Resource crlFile : crlFiles) {
+ try(InputStream is = crlFile.getInputStream()) {
+ crls.addAll(X509Support.decodeCRLs(is));
+ } catch (final CRLException | IOException e) {
+ log.error("{}: Could not decode CRL file at {}: {}", getConfigDescription(), crlFile.getDescription(),
+ e.getMessage());
+ throw new FatalBeanException("Could not decode provided CRL file " + crlFile.getDescription(), e);
+ }
+ }
+ return crls;
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXResourceValidationInfoParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXResourceValidationInfoParser.java
new file mode 100644
index 000000000..e0bac86ea
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXResourceValidationInfoParser.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for <ValidationInfo type="PKIXFilesystem"> and <ValidationInfo type="PKIXResourceBacked">.
+ *
+ * <p>
+ * All of the heavy lifting is done in the super class and the associated factory bean (which gets the parameters of the
+ * type is wants by virtue of Springs type coercion).
+ * </p>
+ */
+public class PKIXResourceValidationInfoParser extends AbstractPKIXValidationInfoParser {
+
+ /** Schema type for PKIXResourceBackedValidationInformation. */
+ public static final QName TYPE_NAME_RESOURCE = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "PKIXResourceBacked");
+
+ /** {@inheritDoc} */
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return PKIXResourceValidationInfoFactoryBean.class;
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXValidationOptionsParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXValidationOptionsParser.java
new file mode 100644
index 000000000..fe32c7348
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXValidationOptionsParser.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.security.x509.PKIXValidationOptions;
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+import net.shibboleth.ext.spring.util.AbstractCustomBeanDefinitionParser;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+
+/**
+ * A Parser for the < ValidationOptions > within a StaticPKIXSignature.
+ */
+public class PKIXValidationOptionsParser extends AbstractCustomBeanDefinitionParser {
+
+ /** Validation Options. */
+ public static final QName ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "ValidationOptions");
+
+ /** {@inheritDoc} */
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return PKIXValidationOptions.class;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void doParse(final Element element, final ParserContext parserContext,
+ final BeanDefinitionBuilder builder) {
+ super.doParse(element, parserContext, builder);
+
+ if (element.hasAttributeNS(null, "processEmptyCRLs")) {
+ builder.addPropertyValue("processEmptyCRLs",
+ StringSupport.trimOrNull(element.getAttributeNS(null, "processEmptyCRLs")));
+ }
+
+ if (element.hasAttributeNS(null, "processExpiredCRLs")) {
+ builder.addPropertyValue("processExpiredCRLs",
+ StringSupport.trimOrNull(element.getAttributeNS(null, "processExpiredCRLs")));
+ }
+
+ if (element.hasAttributeNS(null, "processCredentialCRLs")) {
+ builder.addPropertyValue("processCredentialCRLs",
+ StringSupport.trimOrNull(element.getAttributeNS(null, "processCredentialCRLs")));
+ }
+
+ if (element.hasAttributeNS(null, "defaultVerificationDepth")) {
+ builder.addPropertyValue("defaultVerificationDepth",
+ StringSupport.trimOrNull(element.getAttributeNS(null, "defaultVerificationDepth")));
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override protected boolean shouldGenerateId() {
+ return true;
+ }
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/SignatureChainingParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/SignatureChainingParser.java
new file mode 100644
index 000000000..dbfc6f9e5
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/SignatureChainingParser.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for trust engines of type SignatureChaining.
+ */
+public class SignatureChainingParser extends AbstractChainingParser {
+
+ /** Schema type. */
+ public static final QName TYPE_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "SignatureChaining");
+
+ /** {@inheritDoc} */
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return ChainingSignatureTrustEngineFactory.class;
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeyFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeyFactoryBean.java
new file mode 100644
index 000000000..3d80d2747
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeyFactoryBean.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.cryptacular.EncodingException;
+import org.cryptacular.StreamException;
+import org.cryptacular.util.KeyPairUtil;
+import org.opensaml.security.credential.BasicCredential;
+import org.opensaml.security.credential.Credential;
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.security.trust.impl.ExplicitKeyTrustEngine;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.opensaml.security.x509.X509Support;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.core.io.Resource;
+
+import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+
+/**
+ * Factory bean for simple use cases involving the {@link ExplicitKeyTrustEngine} and static credentials.
+ *
+ * @since 3.3.0
+ */
+public class StaticExplicitKeyFactoryBean extends AbstractComponentAwareFactoryBean<ExplicitKeyTrustEngine> {
+
+ /** Class logger. */
+ @Nonnull private Logger log = LoggerFactory.getLogger(StaticExplicitKeyFactoryBean.class);
+
+ /** The resources to be turned into keys. */
+ private List<Resource> keyResources;
+
+ /** The resources to be turned into certificates. */
+ private List<Resource> certificateResources;
+
+ /** Constructor. */
+ public StaticExplicitKeyFactoryBean() {
+ keyResources = Collections.emptyList();
+ certificateResources = Collections.emptyList();
+ }
+
+ /**
+ * Set the resources which we will convert into certificates.
+ *
+ * @param keys the resources
+ */
+ public void setPublicKeys(@Nullable final List<Resource> keys) {
+ keyResources = keys != null ? keys : Collections.emptyList();
+ }
+
+ /**
+ * Set the resources which we will convert into certificates.
+ *
+ * @param certs the resources
+ */
+ public void setCertificates(@Nullable final List<Resource> certs) {
+ certificateResources = certs != null ? certs : Collections.emptyList();
+ }
+
+ /**
+ * Get the configured certificates.
+ *
+ * @return the certificates null
+ */
+ @Nullable @NonnullElements protected List<Credential> getCredentials() {
+
+ final List<Credential> credentials = new ArrayList<>(keyResources.size() + certificateResources.size());
+
+ for (final Resource f : keyResources) {
+ try(final InputStream is = f.getInputStream()) {
+ credentials.add(new BasicCredential(KeyPairUtil.readPublicKey(is)));
+ } catch (final EncodingException|StreamException|IOException e) {
+ log.error("Could not decode public key from {}: {}", f.getDescription(), e.getMessage());
+ throw new FatalBeanException("Could not decode public key from " + f.getDescription(), e);
+ }
+ }
+
+ for (final Resource f : certificateResources) {
+ try(final InputStream is = f.getInputStream()) {
+ final Collection<X509Certificate> raw = X509Support.decodeCertificates(is);
+ if (raw != null) {
+ raw.forEach(x -> {
+ if (x != null) {
+ credentials.add(new BasicX509Credential(x));
+ }
+ }
+ );
+ }
+
+ } catch (final CertificateException | IOException e) {
+ log.error("Could not decode certificate from {}: {}", f.getDescription(), e.getMessage());
+ throw new FatalBeanException("Could not decode certificate from " + f.getDescription(), e);
+ }
+ }
+
+ return credentials;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Class<?> getObjectType() {
+ return ExplicitKeyTrustEngine.class;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ protected ExplicitKeyTrustEngine doCreateInstance() throws Exception {
+ return new ExplicitKeyTrustEngine(new StaticCredentialResolver(getCredentials()));
+ }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeyParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeyParser.java
new file mode 100644
index 000000000..52ddda134
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeyParser.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import net.shibboleth.ext.spring.util.SpringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.security.trust.impl.ExplicitKeyTrustEngine;
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for trust engines of type StaticExplicitKey TrustEngine.
+ */
+public class StaticExplicitKeyParser extends AbstractTrustEngineParser {
+
+ /** Schema type. */
+ public static final QName TYPE_NAME =
+ new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "StaticExplicitKey");
+
+ /** {@inheritDoc} */
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return ExplicitKeyTrustEngine.class;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void doParse(final Element element, final ParserContext parserContext,
+ final BeanDefinitionBuilder builder) {
+ super.doParse(element, parserContext, builder);
+
+ final List<Element> credentials =
+ ElementSupport.getChildElements(element, SecurityNamespaceHandler.CREDENTIAL_ELEMENT_NAME);
+
+ final BeanDefinitionBuilder resolver =
+ BeanDefinitionBuilder.genericBeanDefinition(StaticCredentialResolver.class);
+ resolver.addConstructorArgValue(SpringSupport.parseCustomElements(credentials, parserContext, resolver));
+
+ builder.addConstructorArgValue(resolver.getBeanDefinition());
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeySignatureParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeySignatureParser.java
new file mode 100644
index 000000000..ab5fd8676
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeySignatureParser.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import net.shibboleth.ext.spring.util.SpringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap;
+import org.opensaml.xmlsec.signature.support.impl.ExplicitKeySignatureTrustEngine;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for trust engines of type StaticExplicitKeySignature.
+ */
+public class StaticExplicitKeySignatureParser extends AbstractTrustEngineParser {
+
+ /** Schema type. */
+ public static final QName TYPE_NAME =
+ new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "StaticExplicitKeySignature");
+
+ /** {@inheritDoc} */
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return ExplicitKeySignatureTrustEngine.class;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void doParse(final Element element, final ParserContext parserContext,
+ final BeanDefinitionBuilder builder) {
+ super.doParse(element, parserContext, builder);
+
+ final List<Element> credentials =
+ ElementSupport.getChildElements(element, SecurityNamespaceHandler.CREDENTIAL_ELEMENT_NAME);
+
+ final BeanDefinitionBuilder resolver =
+ BeanDefinitionBuilder.genericBeanDefinition(StaticCredentialResolver.class);
+ resolver.addConstructorArgValue(SpringSupport.parseCustomElements(credentials, parserContext, resolver));
+
+ builder.addConstructorArgValue(resolver.getBeanDefinition());
+
+ builder.addConstructorArgValue(DefaultSecurityConfigurationBootstrap
+ .buildBasicInlineKeyInfoCredentialResolver());
+ }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXFactoryBean.java
new file mode 100644
index 000000000..8a70ba357
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXFactoryBean.java
@@ -0,0 +1,277 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.Security;
+import java.security.cert.CRLException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.opensaml.security.x509.PKIXTrustEvaluator;
+import org.opensaml.security.x509.X509Support;
+import org.opensaml.security.x509.impl.BasicPKIXValidationInformation;
+import org.opensaml.security.x509.impl.BasicX509CredentialNameEvaluator;
+import org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator;
+import org.opensaml.security.x509.impl.CertPathPKIXValidationOptions;
+import org.opensaml.security.x509.impl.PKIXX509CredentialTrustEngine;
+import org.opensaml.security.x509.impl.StaticPKIXValidationInformationResolver;
+import org.opensaml.security.x509.impl.X509CredentialNameEvaluator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.core.io.Resource;
+
+
+import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+
+/**
+ * File system specific bean for PKIXX509CredentialTrustEngine.
+ *
+ * @since 3.3.0
+ */
+public class StaticPKIXFactoryBean extends AbstractComponentAwareFactoryBean<PKIXX509CredentialTrustEngine> {
+
+ /** log. */
+ @Nonnull private Logger log = LoggerFactory.getLogger(StaticPKIXFactoryBean.class);
+
+ /** Certificate resources. */
+ @Nullable private List<Resource> certificateResources;
+
+ /** CRL resources. */
+ @Nullable private List<Resource> crlResources;
+
+ /** Verification depth. */
+ @Nullable private Integer verifyDepth;
+
+ /** Explicit subject name(s) to match. */
+ @Nullable private Set<String> trustedNames;
+
+ /** Whether to enable name checking. If true a default implementation will be used.
+ * See also: {@link #credentialNameEvaluator}. */
+ private boolean checkNames;
+
+ /** Custom instance of {@link PKIXTrustEvaluator} to use. */
+ private PKIXTrustEvaluator trustEvaluator;
+
+ /** Custom instance of {@link X509CredentialNameEvaluator} to use.
+ * A non-null value overrides {@link #checkNames}. */
+ private X509CredentialNameEvaluator credentialNameEvaluator;
+
+ /** Constructor. */
+ public StaticPKIXFactoryBean() {
+ checkNames = true;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Class<?> getObjectType() {
+ return PKIXX509CredentialTrustEngine.class;
+ }
+
+ /**
+ * Set the resources which we will convert into certificates.
+ *
+ * @param certs the resources
+ */
+ public void setCertificates(@Nullable final List<Resource> certs) {
+ certificateResources = certs;
+ }
+
+ /**
+ * Set the resources which we will convert into CRLs.
+ *
+ * @param crls the resources
+ */
+ public void setCRLs(@Nullable final List<Resource> crls) {
+ crlResources = crls;
+ }
+
+ /**
+ * Set the verify depth.
+ *
+ * @param depth value to set
+ */
+ public void setVerifyDepth(final int depth) {
+ verifyDepth = depth;
+ }
+
+ /**
+ * Set whether the perform name checking in the PKIX layer.
+ *
+ * <p>
+ * Defaults to "true", should generally be disabled when used with an HTTP client
+ * that is already checking names.
+ * </p>
+ *
+ * <p>
+ * If true a default implementation will be used unless a specific name evaluator impl has been supplied.
+ * See also: {@link #setCredentialNameEvaluator(X509CredentialNameEvaluator)}.
+ * </p>
+ *
+ * @param flag flag to set
+ *
+ * @since 3.4.0
+ */
+ public void setCheckNames(final boolean flag) {
+ checkNames = flag;
+ }
+
+ /**
+ * Set explicitly trusted names to match against credential.
+ *
+ * @param names explicitly trusted names
+ *
+ * @since 3.4.0
+ */
+ public void setTrustedNames(@Nullable @NonnullElements final Collection<String> names) {
+ if (names != null) {
+ trustedNames = Set.copyOf(names);
+ } else {
+ trustedNames = null;
+ }
+ }
+
+ /**
+ * Set the custom instance of {@link PKIXTrustEvaluator} to use.
+ *
+ * @param evaluator The trustEvaluator to set.
+ */
+ public void setTrustEvaluator(@Nullable final PKIXTrustEvaluator evaluator) {
+ trustEvaluator = evaluator;
+ }
+
+ /**
+ * Set the custom instance of {@link X509CredentialNameEvaluator} to use.
+ *
+ * <p>
+ * A non-null value overrides {@link #setCheckNames(boolean)}.
+ * </p>
+ *
+ * @param evaluator The credentialNameEvaluator to set.
+ */
+ public void setCredentialNameEvaluator(@Nullable final X509CredentialNameEvaluator evaluator) {
+ credentialNameEvaluator = evaluator;
+ }
+
+ /**
+ * Get the configured certificates.
+ *
+ * @return the certificates
+ */
+ @Nonnull @NonnullElements protected List<X509Certificate> getCertificates() {
+ if (certificateResources == null) {
+ return Collections.emptyList();
+ }
+
+ final List<X509Certificate> certificates = new ArrayList<>(certificateResources.size());
+ for (final Resource f : certificateResources) {
+ try(final InputStream is = f.getInputStream()) {
+ certificates.addAll(X509Support.decodeCertificates(is));
+ } catch (final CertificateException | IOException e) {
+ log.error("Could not decode Certificate at {}: {}", f.getDescription(), e.getMessage());
+ throw new FatalBeanException("Could not decode provided CertificateFile: " + f.getDescription(), e);
+ }
+ }
+ return certificates;
+ }
+
+ /**
+ * Get the configured CRL list.
+ *
+ * @return the crls
+ */
+ @Nonnull @NonnullElements protected List<X509CRL> getCRLs() {
+ if (crlResources == null) {
+ return Collections.emptyList();
+ }
+
+ final List<X509CRL> crls = new ArrayList<>(crlResources.size());
+ for (final Resource crlFile : crlResources) {
+ try(final InputStream is = crlFile.getInputStream()) {
+ crls.addAll(X509Support.decodeCRLs(is));
+ } catch (final CRLException | IOException e) {
+ log.error("Could not decode CRL file at {}: {}", crlFile.getDescription(), e.getMessage());
+ throw new FatalBeanException("Could not decode provided CRL file " + crlFile.getDescription(), e);
+ }
+ }
+ return crls;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ protected PKIXX509CredentialTrustEngine doCreateInstance() throws Exception {
+ final BasicPKIXValidationInformation info =
+ new BasicPKIXValidationInformation(getCertificates(), getCRLs(), verifyDepth);
+
+ final StaticPKIXValidationInformationResolver resolver =
+ new StaticPKIXValidationInformationResolver(Collections.singletonList(info), trustedNames, checkNames);
+
+ final PKIXTrustEvaluator pkixTrustEvaluator =
+ trustEvaluator != null ? trustEvaluator : new CertPathPKIXTrustEvaluator();
+
+ final X509CredentialNameEvaluator credNameEvaluator =
+ credentialNameEvaluator != null ? credentialNameEvaluator :
+ (checkNames ? new BasicX509CredentialNameEvaluator() : null);
+
+ validateConfiguration(pkixTrustEvaluator);
+
+ return new PKIXX509CredentialTrustEngine(resolver, pkixTrustEvaluator, credNameEvaluator);
+ }
+
+ /**
+ * Validate the configuration of the effective {@link PKIXTrustEvaluator}.
+ *
+ * @param pkixTrustEvaluator the instance whose configuration is to be evaluated
+ *
+ * @throws Exception if configuration issues are encountered
+ */
+ protected void validateConfiguration(@Nonnull final PKIXTrustEvaluator pkixTrustEvaluator) throws Exception {
+ if (CertPathPKIXTrustEvaluator.class.isInstance(pkixTrustEvaluator)
+ && CertPathPKIXValidationOptions.class.isInstance(pkixTrustEvaluator.getPKIXValidationOptions())) {
+
+ final CertPathPKIXValidationOptions certPathOptions =
+ CertPathPKIXValidationOptions.class.cast(pkixTrustEvaluator.getPKIXValidationOptions());
+
+ if (certPathOptions.isForceRevocationEnabled() && certPathOptions.isRevocationEnabled()
+ && getCRLs().isEmpty()
+ && ! Boolean.getBoolean("com.sun.security.enableCRLDP")
+ && ! "true".equalsIgnoreCase(StringSupport.trimOrNull(Security.getProperty("oscp.enable"))) ) {
+
+ log.error("Certificate revocation checking was force enabled, "
+ + "but no static CRLs were supplied and both CRLDP and OCSP processing is disabled");
+
+ throw new FatalBeanException("Certificate revocation checking was force enabled, "
+ + "but no static CRLs were supplied and both CRLDP and OCSP processing is disabled");
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXSignatureParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXSignatureParser.java
new file mode 100644
index 000000000..21f527f61
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXSignatureParser.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap;
+import org.opensaml.xmlsec.signature.support.impl.PKIXSignatureTrustEngine;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for trust engines of type StaticPKIXKeySignature.
+ */
+public class StaticPKIXSignatureParser extends AbstractStaticPKIXParser {
+
+ /** Schema type. */
+ public static final QName TYPE_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "StaticPKIXSignature");
+
+ /** {@inheritDoc} */
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return PKIXSignatureTrustEngine.class;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * <p>We call into
+ * {@link
+ * PKIXSignatureTrustEngine#PKIXSignatureTrustEngine(
+ * org.opensaml.security.x509.PKIXValidationInformationResolver,
+ * org.opensaml.xmlsec.keyinfo.KeyInfoCredentialResolver,
+ * org.opensaml.security.x509.PKIXTrustEvaluator,
+ * org.opensaml.security.x509.impl.X509CredentialNameEvaluator)}.
+ * </p>
+ */
+ @Override protected void doParse(final Element element, final ParserContext parserContext,
+ final BeanDefinitionBuilder builder) {
+ super.doParse(element, parserContext, builder);
+
+ builder.addConstructorArgValue(getPKIXValidationInformationResolver(element, parserContext));
+ builder.addConstructorArgValue(DefaultSecurityConfigurationBootstrap
+ .buildBasicInlineKeyInfoCredentialResolver());
+ builder.addConstructorArgValue(getPKIXTrustEvaluator(element, parserContext));
+ builder.addConstructorArgValue(getX509CredentialNameEvaluator(element, parserContext));
+ }
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXX509CredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXX509CredentialParser.java
new file mode 100644
index 000000000..afd63585e
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXX509CredentialParser.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.security.x509.impl.PKIXX509CredentialTrustEngine;
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for trust engines of type StaticPKIXX509Credential.
+ */
+public class StaticPKIXX509CredentialParser extends AbstractStaticPKIXParser {
+
+ /** Schema type. */
+ public static final QName TYPE_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+ "StaticPKIXX509Credential");
+
+ /** {@inheritDoc} */
+ @Override protected Class<?> getBeanClass(final Element element) {
+ return PKIXX509CredentialTrustEngine.class;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * <p>
+ * We call into
+ * {@link PKIXX509CredentialTrustEngine#PKIXX509CredentialTrustEngine(
+ * org.opensaml.security.x509.PKIXValidationInformationResolver,
+ * org.opensaml.security.x509.PKIXTrustEvaluator,
+ * org.opensaml.security.x509.impl.X509CredentialNameEvaluator)}.
+ * </p>
+ */
+ @Override protected void doParse(final Element element, final ParserContext parserContext,
+ final BeanDefinitionBuilder builder) {
+ super.doParse(element, parserContext, builder);
+
+ builder.addConstructorArgValue(getPKIXValidationInformationResolver(element, parserContext));
+ builder.addConstructorArgValue(getPKIXTrustEvaluator(element, parserContext));
+ builder.addConstructorArgValue(getX509CredentialNameEvaluator(element, parserContext));
+ }
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/package-info.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/package-info.java
new file mode 100644
index 000000000..5bf1420a2
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Factory beans for trust engines.
+ */
+
+package org.opensaml.spring.trust;
\ No newline at end of file
diff --git a/opensaml-spring/src/main/resources/META-INF/spring.handlers b/opensaml-spring/src/main/resources/META-INF/spring.handlers
new file mode 100644
index 000000000..2f46adcc7
--- /dev/null
+++ b/opensaml-spring/src/main/resources/META-INF/spring.handlers
@@ -0,0 +1 @@
+urn\:mace\:shibboleth\:2.0\:security = org.opensaml.spring.SecurityNamespaceHandler
diff --git a/opensaml-spring/src/main/resources/META-INF/spring.schemas b/opensaml-spring/src/main/resources/META-INF/spring.schemas
new file mode 100644
index 000000000..c71f89d10
--- /dev/null
+++ b/opensaml-spring/src/main/resources/META-INF/spring.schemas
@@ -0,0 +1,5 @@
+# Modern variant
+http\://shibboleth.net/schema/idp/shibboleth-security.xsd = schema/shibboleth-security.xsd
+
+# Legacy variant
+classpath\:/schema/shibboleth-2.0-security.xsd = schema/shibboleth-security.xsd
diff --git a/opensaml-spring/src/main/resources/schema/shibboleth-security.xsd b/opensaml-spring/src/main/resources/schema/shibboleth-security.xsd
new file mode 100644
index 000000000..95ad23fb0
--- /dev/null
+++ b/opensaml-spring/src/main/resources/schema/shibboleth-security.xsd
@@ -0,0 +1,612 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sec="urn:mace:shibboleth:2.0:security" targetNamespace="urn:mace:shibboleth:2.0:security" elementFormDefault="qualified">
+
+ <!-- CREDENTIAL RELATED OBJECTS -->
+ <element name="Credential" type="sec:CredentialType"/>
+
+ <complexType name="X509Inline">
+ <annotation>
+ <documentation>
+ Allows credentials to be components to be specified as content within the child elements. Keys,
+ Certificates, and CRLs may be PKCS#12, DER, or PEM encoded and may be encrypted or not.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:X509Credential"/>
+ </complexContent>
+ </complexType>
+
+ <complexType name="X509ResourceBacked">
+ <annotation>
+ <documentation>
+ Allows credential components to be loaded from a Spring Resource. Keys, Certificates, and CRLs may be
+ PKCS#12, DER, or PEM encoded and may be encrypted or not.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:X509Credential"/>
+ </complexContent>
+ </complexType>
+
+ <complexType name="X509Credential" abstract="true">
+ <annotation>
+ <documentation>
+ Defines the components of an X.509 credential.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:CredentialType">
+ <sequence>
+ <element name="PrivateKey" minOccurs="0">
+ <annotation>
+ <documentation>Credential's RSA/DSA private key.</documentation>
+ </annotation>
+ </element>
+ <element name="Certificate" minOccurs="1" maxOccurs="unbounded">
+ <annotation>
+ <documentation>
+ Certificate associated with the credential. More than one certificate
+ may be present within a single element, if the encoding form used allows
+ it, or multiple certificate elements may be used, or both.
+ </documentation>
+ </annotation>
+ </element>
+ <element name="CRL" minOccurs="0" maxOccurs="unbounded">
+ <annotation>
+ <documentation>
+ Certificate revocation list associated with the Credential. More than
+ one CRL may be present within a single element, if the encoding form
+ used allows it, or multiple CRL elements may be used, or both.
+ </documentation>
+ </annotation>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="BasicInline">
+ <annotation>
+ <documentation>
+ Allows credentials to be components to be specified as content within the child elements.
+ Keys may be PKCS#12, DER, or PEM encoded and may be encrypted or not.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:BasicCredential"/>
+ </complexContent>
+ </complexType>
+
+ <complexType name="BasicResourceBacked">
+ <annotation>
+ <documentation>
+ Allows credential components to be specified by Spring Resource specification.
+ Keys may be PKCS#12, DER, or PEM encoded and may be encrypted or not.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:BasicCredential"/>
+ </complexContent>
+ </complexType>
+
+ <complexType name="BasicCredential" abstract="true">
+ <annotation>
+ <documentation>
+ Defines the components of a basic credential containing either a
+ public key and optional private key, or a symmetric (secret) key.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:CredentialType">
+ <sequence>
+ <choice>
+ <element name="SecretKey">
+ <annotation>
+ <documentation>Credential's symmetric key.</documentation>
+ </annotation>
+ <complexType>
+ <simpleContent>
+ <extension base="string">
+ <attribute name="algorithm" type="sec:string" use="required">
+ <annotation>
+ <documentation>
+ The JCA key algorithm identifier.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="encoding" use="required">
+ <annotation>
+ <documentation>
+ The encoded format of the key data. Defaults to: base64.
+ </documentation>
+ </annotation>
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="binary" />
+ <enumeration value="hex" />
+ <enumeration value="base64" />
+ </restriction>
+ </simpleType>
+ </attribute>
+ </extension>
+ </simpleContent>
+ </complexType>
+ </element>
+ <sequence>
+ <element name="PrivateKey" minOccurs="0">
+ <annotation>
+ <documentation>Credential's RSA/DSA private key.</documentation>
+ </annotation>
+ </element>
+ <element name="PublicKey">
+ <annotation>
+ <documentation>Credential's RSA/DSA public key.</documentation>
+ </annotation>
+ </element>
+ </sequence>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="CredentialType" abstract="true">
+ <annotation>
+ <documentation>Base type for credential information.</documentation>
+ </annotation>
+ <sequence>
+ <element name="KeyName" type="sec:string" minOccurs="0" maxOccurs="unbounded">
+ <annotation>
+ <documentation>Name(s) of the key this credential represents.</documentation>
+ </annotation>
+ </element>
+ </sequence>
+ <attribute name="id" type="sec:string">
+ <annotation>
+ <documentation>Unique id for this credential.</documentation>
+ </annotation>
+ </attribute>
+ <attribute name="entityID" type="sec:string">
+ <annotation>
+ <documentation>Identifier for the entity which owns this credential.</documentation>
+ </annotation>
+ </attribute>
+ <attribute name="usage" type="sec:CredentialUsageType">
+ <annotation>
+ <documentation>
+ Usage type for this credential. Acceptable values are "Encryption" or "Signing". If no usage type is
+ given components may choose to use the credential for either encryption or signing operations.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+
+ <simpleType name="CredentialUsageType">
+ <restriction base="string">
+ <enumeration value="Encryption"/>
+ <enumeration value="Signing"/>
+ </restriction>
+ </simpleType>
+
+ <complexType name="PasswordBearingString">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="password" type="string">
+ <annotation>
+ <documentation>
+ Password associated with the resource identified by elements of this type.
+ </documentation>
+ </annotation>
+ </attribute>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <!-- VALIDATION RELATED OBJECTS, FOR EXAMPLE PKIX INFO -->
+ <element name="ValidationInfo" type="sec:ValidationInfoType"/>
+
+ <element name="ValidationOptions" type="sec:ValidationOptionsType"/>
+
+ <complexType name="PKIXInline">
+ <annotation>
+ <documentation>
+ Allows PKIX validation info components to be specified as content within the child elements.
+ Certificates and CRLs may be PKCS#12, DER, or PEM encoded and may be encrypted or not.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:PKIXValidationInfoType"/>
+ </complexContent>
+ </complexType>
+
+ <complexType name="PKIXResourceBacked">
+ <annotation>
+ <documentation>
+ Allows PKIX validation info components to be specified by a Spring Resource specification.
+ Certificates, and CRLs may be PKCS#12, DER, or PEM encoded and may be encrypted or not.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:PKIXValidationInfoType"/>
+ </complexContent>
+ </complexType>
+
+ <complexType name="PKIXValidationInfoType" abstract="true">
+ <annotation>
+ <documentation>
+ Defines the components of a set of PKIX validation information.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:ValidationInfoType">
+ <sequence>
+ <element name="Certificate" minOccurs="0" maxOccurs="unbounded">
+ <annotation>
+ <documentation>
+ Trusted certificates, typically of root and intermediate CA's , which are used
+ as input to the PKIX validation process.
+ </documentation>
+ </annotation>
+ </element>
+ <element name="CRL" minOccurs="0" maxOccurs="unbounded">
+ <annotation>
+ <documentation>
+ Certificate revocation lists which are used as input to the PKIX validation process.
+ </documentation>
+ </annotation>
+ </element>
+ </sequence>
+ <attribute name="verifyDepth" type="sec:string">
+ <annotation>
+ <documentation>
+ The maximum path verification depth to consider when constructing a PKIX cert path.
+ </documentation>
+ </annotation>
+ </attribute>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="ValidationInfoType" abstract="true">
+ <annotation>
+ <documentation>Base type for validation information.</documentation>
+ </annotation>
+ <attribute name="id" type="sec:string" use="required">
+ <annotation>
+ <documentation>Unique id for this validation info set.</documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="ValidationOptionsType">
+ <annotation>
+ <documentation>Type for basic PKIX validation options set for PKIX trust engines.</documentation>
+ </annotation>
+ <attribute name="processEmptyCRLs" type="sec:string">
+ <annotation>
+ <documentation>Flag as to whether empty CRL's will be processed. Defaults to true.</documentation>
+ </annotation>
+ </attribute>
+ <attribute name="processExpiredCRLs" type="sec:string">
+ <annotation>
+ <documentation>Flag as to whether expired CRL's will be processed. Defaults to true.</documentation>
+ </annotation>
+ </attribute>
+ <attribute name="processCredentialCRLs" type="sec:string">
+ <annotation>
+ <documentation>
+ Flag as to whether CRL's supplied in the untrusted credential
+ being evaluated will be processed. Defaults to true.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="defaultVerificationDepth" type="sec:string">
+ <annotation>
+ <documentation>Default PKIX path verification depth. Defaults to 1.</documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+
+ <complexType name="CertPathValidationOptionsType">
+ <annotation>
+ <documentation>
+ Type specialization for PKIX validation options set for PKIX trust engines
+ using the Java CertPath API.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:ValidationOptionsType">
+ <sequence>
+ <element name="PolicyOID" type="sec:string" minOccurs="0" maxOccurs="unbounded">
+ <annotation>
+ <documentation>
+ Sets the initial policy identifiers (OID strings) for the underlying CertPath Provider,
+ i.e. those policies that are acceptable to the certificate user.
+ See also RFC 5280, section 6.1.1 (c).
+ If no policy identifier is specified, any policy is considered acceptable.
+ </documentation>
+ </annotation>
+ </element>
+ </sequence>
+ <attribute name="forceRevocationEnabled" type="sec:string">
+ <annotation>
+ <documentation>
+ If true, the revocation behavior of the underlying CertPath provider will be forced to the
+ value supplied by the revocationEnabled attribute. If false, the revocation behavior
+ of the underlying provider will be determined by the PKIXTrustEvaluator implementation.
+ Defaults to false.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="revocationEnabled" type="sec:string">
+ <annotation>
+ <documentation>
+ If the attribute forceRevocationEnabled is true, the revocation behavior of the underlying CertPath
+ Provider will be forced to this value. If the former is false, the revocation behavior
+ of the underlying provider will be determined by the PKIXTrustEvaluator implementation.
+ Defaults to true.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="policyMappingInhibit" type="sec:string">
+ <annotation>
+ <documentation>
+ Sets the policy mapping inhibited flag for the underlying CertPath Provider.
+ See also RFC 5280, section 6.1.1 (e).
+ Defaults to false.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="anyPolicyInhibit" type="sec:string">
+ <annotation>
+ <documentation>
+ Sets the any policy inhibited flag for the underlying CertPath Provider.
+ See also RFC 5280, section 6.1.1 (g).
+ Defaults to false.
+ </documentation>
+ </annotation>
+ </attribute>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <!-- TRUST ENGINE RELATED OBJECTS -->
+ <element name="TrustEngine" type="sec:TrustEngineType"/>
+
+ <complexType name="Chaining">
+ <annotation>
+ <documentation>
+ Trust engine which chains together other trust engine instances, evaluating a token
+ against each engine in chain order.
+
+ If the token to be evaluated can be established as trusted by one member of the chain,
+ then the token is trusted. Otherwise it is evaluated as untrusted.
+
+ Trust chain members must all evaluate tokens of a compatible type,
+ for example a Credential or Signature.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:TrustEngineType">
+ <choice minOccurs="1" maxOccurs="unbounded">
+ <element ref="sec:TrustEngine"/>
+ <element name="TrustEngineRef">
+ <annotation>
+ <documentation>Reference to a trust engine.</documentation>
+ </annotation>
+ <complexType>
+ <attribute name="ref">
+ <annotation>
+ <documentation>Bean reference id for a trust engine declared elsewhere.</documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </choice>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="SignatureChaining">
+ <annotation>
+ <documentation>
+ Trust engine which chains together other signature trust engine instances, evaluating the signature
+ against each engine in chain order.
+
+ If the signature to be evaluated can be established as trusted by one member of the chain,
+ then the signature is trusted. Otherwise it is evaluated as untrusted.
+
+ Trust chain members must all evaluate signatures.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:TrustEngineType">
+ <choice minOccurs="1" maxOccurs="unbounded">
+ <element ref="sec:TrustEngine"/>
+ <element name="TrustEngineRef">
+ <annotation>
+ <documentation>Reference to a trust engine.</documentation>
+ </annotation>
+ <complexType>
+ <attribute name="ref">
+ <annotation>
+ <documentation>Bean reference id for a trust engine declared elsewhere.</documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+ </choice>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <!-- Trust engines which use resolvers configured via static information -->
+ <complexType name="StaticExplicitKey">
+ <annotation>
+ <documentation>
+ Trust engine used to validate a key against statically-configured trusted keys.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:TrustEngineType">
+ <sequence>
+ <element ref="sec:Credential" minOccurs="1" maxOccurs="unbounded">
+ <annotation>
+ <documentation>
+ A trusted credential to be included in the static trusted credential set.
+ </documentation>
+ </annotation>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="StaticPKIXX509Credential">
+ <annotation>
+ <documentation>
+ Trust engine used to validate an X509 credential against statically-configured PKIX information.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:TrustEngineType">
+ <sequence>
+ <element name="TrustedName" type="sec:string" minOccurs="0" maxOccurs="unbounded">
+ <annotation>
+ <documentation>
+ Specifies a trusted name against which the target entity
+ certificate's public key must be bound for trust processing to be successful.
+
+ Supported trusted name formats are:
+ 1) Subject DN in RFC 2253 or RFC 1779 format
+ 2) CN component of subject DN
+ 3) Subject alt names (DNS and URI types)
+
+ If multiple instances of this element are present, trust processing
+ is successful if the target entity certificate matches at least one of them.
+
+ Trusted names are ignored and therefore optional if trustedNameCheckEnabled = false.
+ </documentation>
+ </annotation>
+ </element>
+ <element ref="sec:ValidationInfo" minOccurs="1" maxOccurs="unbounded">
+ <annotation>
+ <documentation>
+ PKIX validation info against which to validate an X509 credential.
+ </documentation>
+ </annotation>
+ </element>
+ <element ref="sec:ValidationOptions" minOccurs="0" maxOccurs="1">
+ <annotation>
+ <documentation>
+ Set of options to influence PKIX trust validation processing.
+ </documentation>
+ </annotation>
+ </element>
+ </sequence>
+ <attribute name="trustedNameCheckEnabled" type="sec:string">
+ <annotation>
+ <documentation>
+ If true, the candidate X509Crednetial's certificate must match one of the
+ names indicated via the TrustedName child elements.
+ Defaults to true.
+ </documentation>
+ </annotation>
+ </attribute>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="StaticExplicitKeySignature">
+ <annotation>
+ <documentation>
+ Trust engine used to validate a signature against statically-configured trusted keys.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:TrustEngineType">
+ <sequence>
+ <element ref="sec:Credential" minOccurs="1" maxOccurs="unbounded">
+ <annotation>
+ <documentation>
+ A trusted credential to be included in the static trusted credential set.
+ </documentation>
+ </annotation>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="StaticPKIXSignature">
+ <annotation>
+ <documentation>
+ Trust engine used to validate signatures against statically-configured PKIX information.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="sec:TrustEngineType">
+ <sequence>
+ <element name="TrustedName" type="sec:string" minOccurs="0" maxOccurs="unbounded">
+ <annotation>
+ <documentation>
+ Specifies a trusted name against which the target entity
+ certificate's public key must be bound for trust processing to be successful.
+
+ Supported trusted name formats are:
+ 1) Subject DN in RFC 2253 or RFC 1779 format
+ 2) CN component of subject DN
+ 3) Subject alt names (DNS and URI types)
+
+ If multiple instances of this element are present, trust processing
+ is successful if the target entity certificate matches at least one of them.
+
+ Trusted names are ignored and therefore optional if trustedNameCheckEnabled=false.
+ </documentation>
+ </annotation>
+ </element>
+ <element ref="sec:ValidationInfo" minOccurs="1" maxOccurs="unbounded">
+ <annotation>
+ <documentation>
+ PKIX validation info against which to validate a signature.
+ </documentation>
+ </annotation>
+ </element>
+ <element ref="sec:ValidationOptions" minOccurs="0" maxOccurs="1">
+ <annotation>
+ <documentation>
+ Set of options to influence PKIX trust validation processing.
+ </documentation>
+ </annotation>
+ </element>
+ </sequence>
+ <attribute name="trustedNameCheckEnabled" type="sec:string">
+ <annotation>
+ <documentation>
+ If true, the candidate X509Crednetial's certificate must match one of the
+ names indicated via the TrustedName child elements.
+ Defaults to true.
+ </documentation>
+ </annotation>
+ </attribute>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="TrustEngineType" abstract="true">
+ <attribute name="id" type="sec:string" use="required">
+ <annotation>
+ <documentation>
+ Unique ID of the trust engine.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+
+ <simpleType name="string">
+ <restriction base="string">
+ <minLength value="1"/>
+ </restriction>
+ </simpleType>
+
+</schema>
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/AbstractSecurityParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/AbstractSecurityParserTest.java
new file mode 100644
index 000000000..a8f4f3782
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/AbstractSecurityParserTest.java
@@ -0,0 +1,97 @@
+
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+
+import net.shibboleth.ext.spring.util.ApplicationContextBuilder;
+
+import org.springframework.context.support.GenericApplicationContext;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.mock.env.MockPropertySource;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeSuite;
+
+/**
+ * Base mechanics for Security parser tests
+ */
+ at SuppressWarnings("javadoc")
+public class AbstractSecurityParserTest {
+
+ private static final String PATH = "/org/opensaml/spring/";
+
+ protected static final String SP_ID = "https://sp.example.org/sp/shibboleth";
+ protected static final String IDP_ID = "https://idp.example.org/idp/shibboleth";
+
+ static private String workspaceDirName;
+
+ private GenericApplicationContext pendingTeardownContext = null;
+
+ @AfterMethod public void tearDownTestContext() {
+ if (null == pendingTeardownContext ) {
+ return;
+ }
+ pendingTeardownContext.close();
+ pendingTeardownContext = null;
+ }
+
+ protected void setTestContext(final GenericApplicationContext context) {
+ tearDownTestContext();
+ pendingTeardownContext = context;
+ }
+
+ @BeforeSuite public void setupDirs() throws IOException {
+ final ClassPathResource resource = new ClassPathResource(PATH);
+ workspaceDirName = resource.getFile().getAbsolutePath();
+ }
+
+ protected <T> T getBean(final Class<T> claz, final String... files) throws IOException{
+ return getBean(null, claz, files);
+ }
+
+ protected <T> T getBean(final String name, final Class<T> claz, final String... files) throws IOException{
+ final Resource[] resources = new Resource[files.length];
+
+ for (int i = 0; i < files.length; i++) {
+ resources[i] = new ClassPathResource(PATH + files[i]);
+ }
+
+ final ApplicationContextBuilder builder = new ApplicationContextBuilder();
+
+ builder.setName("ApplicationContext: " + claz);
+
+ final MockPropertySource mockEnvVars = new MockPropertySource();
+ mockEnvVars.setProperty("DIR", workspaceDirName);
+ builder.setPropertySources(Collections.singletonList(mockEnvVars));
+
+ builder.setServiceConfigurations(Arrays.asList(resources));
+
+ final GenericApplicationContext context = builder.build();
+
+ setTestContext(context);
+
+ if (name != null) {
+ return context.getBean(name, claz);
+ }
+ return context.getBean(claz);
+ }
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicInlineParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicInlineParserTest.java
new file mode 100644
index 000000000..d4c93abda
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicInlineParserTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.IOException;
+
+import javax.crypto.SecretKey;
+
+import org.opensaml.security.credential.BasicCredential;
+import org.opensaml.security.credential.Credential;
+import org.opensaml.spring.AbstractSecurityParserTest;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test parsing Basic Inline Credentials
+ */
+ at SuppressWarnings("javadoc")
+public class BasicInlineParserTest extends AbstractSecurityParserTest {
+
+ @Test public void publicOnly() throws IOException {
+ final BasicCredential credential =
+ (BasicCredential) getBean(Credential.class, "credential/inlinePublicOnly.xml");
+
+ Assert.assertNull(credential.getPrivateKey());
+ }
+/*
+ @Test(expectedExceptions={BeanCreationException.class,}) public void wrongCert() throws IOException {
+ getBean(Credential.class, true, "credential/inlineWrongCert.xml");
+ }
+ */
+ @Test public void publicPrivate() throws IOException {
+ final BasicCredential credential =
+ (BasicCredential) getBean(Credential.class, "credential/inlinePublicPrivate.xml");
+ Assert.assertNotNull(credential.getPrivateKey());
+
+ }
+
+ @Test public void secretBase64() throws IOException {
+ final BasicCredential credential =
+ (BasicCredential) getBean(Credential.class, "credential/secretKeyAESBase64.xml");
+ Assert.assertNotNull(credential.getSecretKey());
+ SecretKey key = credential.getSecretKey();
+ Assert.assertEquals(key.getAlgorithm(), "AES");
+ }
+
+ @Test public void secretHex() throws IOException {
+ final BasicCredential credential =
+ (BasicCredential) getBean(Credential.class, "credential/secretKeyAESHex.xml");
+ Assert.assertNotNull(credential.getSecretKey());
+ SecretKey key = credential.getSecretKey();
+ Assert.assertEquals(key.getAlgorithm(), "AES");
+ }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicResourceParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicResourceParserTest.java
new file mode 100644
index 000000000..62d09d75e
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicResourceParserTest.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.IOException;
+
+import javax.crypto.SecretKey;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.credential.BasicCredential;
+import org.opensaml.security.credential.Credential;
+import org.springframework.beans.factory.BeanCreationException;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test parsing Basic File System and Resource Credentials
+ */
+ at SuppressWarnings("javadoc")
+public class BasicResourceParserTest extends AbstractSecurityParserTest {
+
+ @Test public void publicOnly() throws IOException {
+ final BasicCredential credential =
+ (BasicCredential) getBean(Credential.class, "credential/resourcePublicOnly.xml");
+
+ Assert.assertNull(credential.getPrivateKey());
+ }
+
+ @Test(expectedExceptions={BeanCreationException.class,}) public void wrongCert() throws IOException {
+ getBean(Credential.class, "credential/resourceWrongPublic.xml");
+ }
+
+ @Test public void publicPrivate() throws IOException {
+ final BasicCredential credential =
+ (BasicCredential) getBean(Credential.class, "credential/resourcePublicPrivate.xml");
+ Assert.assertNotNull(credential.getPrivateKey());
+
+ }
+
+ @Test public void secretBase64() throws IOException {
+ final BasicCredential credential =
+ (BasicCredential) getBean(Credential.class, "credential/resourceSecretAESBase64.xml");
+ Assert.assertNotNull(credential.getSecretKey());
+ SecretKey key = credential.getSecretKey();
+ Assert.assertEquals(key.getAlgorithm(), "AES");
+ }
+
+ @Test public void secretHex() throws IOException {
+ final BasicCredential credential =
+ (BasicCredential) getBean(Credential.class, "credential/resourceSecretAESHex.xml");
+ Assert.assertNotNull(credential.getSecretKey());
+ SecretKey key = credential.getSecretKey();
+ Assert.assertEquals(key.getAlgorithm(), "AES");
+ }
+
+ @Test public void secretBinary() throws IOException {
+ final BasicCredential credential =
+ (BasicCredential) getBean(Credential.class, "credential/resourceSecretAESBinary.xml");
+ Assert.assertNotNull(credential.getSecretKey());
+ SecretKey key = credential.getSecretKey();
+ Assert.assertEquals(key.getAlgorithm(), "AES");
+ }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicX509CredentialFactoryBeanTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicX509CredentialFactoryBeanTest.java
new file mode 100644
index 000000000..adf7a4478
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicX509CredentialFactoryBeanTest.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import org.opensaml.security.x509.BasicX509Credential;
+import org.springframework.context.support.GenericApplicationContext;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import net.shibboleth.ext.spring.context.FilesystemGenericApplicationContext;
+import net.shibboleth.ext.spring.util.SchemaTypeAwareXMLBeanDefinitionReader;
+
+/**
+ * Unit test for {@link BasicX509CredentialFactoryBean}.
+ */
+public class BasicX509CredentialFactoryBeanTest {
+
+ @Test public void bean() {
+ final GenericApplicationContext context = new FilesystemGenericApplicationContext();
+ context.setDisplayName("ApplicationContext: X509Credential");
+ final SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
+ new SchemaTypeAwareXMLBeanDefinitionReader(context);
+
+ beanDefinitionReader.loadBeanDefinitions("org/opensaml/spring/credential/bean.xml");
+
+ context.refresh();
+
+ final BasicX509Credential cred1 = context.getBean("Credential", BasicX509Credential.class);
+
+ final BasicX509Credential cred2 = context.getBean("EncCredential", BasicX509Credential.class);
+
+ Assert.assertEquals("http://example.org/enc", cred2.getEntityId());
+
+ final byte[] cb1 = cred1.getPrivateKey().getEncoded();
+ final byte[] cb2 = cred2.getPrivateKey().getEncoded();
+
+ Assert.assertEquals(cb1.length, cb2.length);
+
+ for (int i = 0; i< cb1.length; i++)Assert.assertEquals(cb1[i], cb2[i]);
+
+ Assert.assertEquals(cred2.getPublicKey(), cred2.getPublicKey());
+
+ }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/credential/X509FilesystemParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/credential/X509FilesystemParserTest.java
new file mode 100644
index 000000000..51cfa8e04
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/credential/X509FilesystemParserTest.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.credential.Credential;
+import org.opensaml.security.credential.UsageType;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.springframework.beans.factory.BeanCreationException;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test parsing X509 Filesystem Credentials
+ */
+ at SuppressWarnings("javadoc")
+public class X509FilesystemParserTest extends AbstractSecurityParserTest {
+
+ private BasicX509Credential lookup(String file) throws IOException {
+ return (BasicX509Credential) getBean(Credential.class, "credential/" + file);
+ }
+
+ @Test public void certOnly() throws IOException {
+ final BasicX509Credential credential = lookup("resourceCertOnly.xml");
+
+ Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+ Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+ Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(),
+ Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+ }
+
+ @Test(expectedExceptions = {BeanCreationException.class,}) public void twoCert() throws IOException {
+ lookup("resourceTwoCert.xml");
+ }
+
+ @Test(expectedExceptions = {BeanCreationException.class,}) public void wrongCert() throws IOException {
+ lookup("resourceWrongCert.xml");
+ }
+
+ @Test public void certKeyCrl() throws IOException {
+ final BasicX509Credential credential = lookup("resourceKeyCertCrl.xml");
+
+ Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(),
+ Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+ Assert.assertEquals(credential.getEntityCertificateChain().size(), 3);
+ Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+ Assert.assertEquals(credential.getCRLs().size(), 1);
+ Assert.assertEquals(credential.getCRLs().iterator().next().getNextUpdate().getTime(),
+ Instant.parse("2007-09-02T14:14:48Z").toEpochMilli());
+ }
+
+ @Test public void certElementsKeyNames() throws IOException {
+ final BasicX509Credential credential = lookup("resourceCertElementsKeyName.xml");
+
+ Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+ Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+ Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(),
+ Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+
+ Assert.assertEquals(credential.getUsageType(), UsageType.SIGNING);
+ Assert.assertEquals(credential.getKeyNames().size(), 2);
+ Assert.assertTrue(credential.getKeyNames().contains("Name1"));
+ Assert.assertTrue(credential.getKeyNames().contains("Name2"));
+
+ }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/credential/X509InlineParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/credential/X509InlineParserTest.java
new file mode 100644
index 000000000..1565caf4b
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/credential/X509InlineParserTest.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.credential.Credential;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.springframework.beans.factory.BeanCreationException;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test parsing X509 Inline Credentials
+ */
+ at SuppressWarnings("javadoc")
+public class X509InlineParserTest extends AbstractSecurityParserTest {
+
+ @Test public void certOnly() throws IOException {
+ final BasicX509Credential credential =
+ (BasicX509Credential) getBean(Credential.class, "credential/inlineCertOnly.xml");
+
+ Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+ Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+ Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+ }
+
+ @Test(expectedExceptions={BeanCreationException.class,}) public void wrongCert() throws IOException {
+ getBean(Credential.class, "credential/inlineWrongCert.xml");
+ }
+
+ @Test public void certKeyCrl() throws IOException {
+ final BasicX509Credential credential =
+ (BasicX509Credential) getBean(Credential.class, "credential/inlineKeyCertCrl.xml");
+
+ Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+ Assert.assertEquals(credential.getEntityCertificateChain().size(), 3);
+ Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+ Assert.assertEquals(credential.getCRLs().size(), 1);
+ Assert.assertEquals(credential.getCRLs().iterator().next().getNextUpdate().getTime(), Instant.parse("2007-09-02T14:14:48Z").toEpochMilli());
+ }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/ChainingTrustEngineTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/ChainingTrustEngineTest.java
new file mode 100644
index 000000000..22ecba529
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/ChainingTrustEngineTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.SecurityException;
+import org.opensaml.security.trust.impl.ChainingTrustEngine;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+ at SuppressWarnings("javadoc")
+public class ChainingTrustEngineTest extends AbstractSecurityParserTest {
+
+ private ChainingTrustEngine<?> lookup(String file) throws IOException {
+ return getBean(ChainingTrustEngine.class, "trust/" + file);
+ }
+
+
+ @Test public void one() throws IOException, SecurityException {
+ final ChainingTrustEngine<?> engine = lookup("chainingTrue.xml");
+
+ Assert.assertEquals(engine.getChain().size(), 1);
+ Assert.assertTrue(engine.validate(null, null));
+ }
+
+ @Test public void two() throws IOException, SecurityException {
+ final ChainingTrustEngine<?> engine = lookup("chainingTrueFalse.xml");
+
+ Assert.assertEquals(engine.getChain().size(), 2);
+ Assert.assertTrue(engine.validate(null, null));
+ }
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/MockTrustEngine.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/MockTrustEngine.java
new file mode 100644
index 000000000..fc3481353
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/MockTrustEngine.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
+
+import org.opensaml.security.SecurityException;
+import org.opensaml.security.trust.TrustEngine;
+
+ at SuppressWarnings("javadoc")
+public class MockTrustEngine<T> implements TrustEngine<T> {
+
+ private final boolean result;
+
+ /**
+ * Constructor.
+ *
+ * @param retVal ...
+ */
+ public MockTrustEngine(boolean retVal) {
+ result = retVal;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean validate(T token, CriteriaSet trustBasisCriteria) throws SecurityException {
+ return result;
+ }
+
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXFilesystemParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXFilesystemParserTest.java
new file mode 100644
index 000000000..d65a14868
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXFilesystemParserTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.x509.PKIXValidationInformation;
+import org.opensaml.security.x509.impl.BasicPKIXValidationInformation;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for parsing of filesystem backed ValidationInfo
+ */
+ at SuppressWarnings("javadoc")
+public class PKIXFilesystemParserTest extends AbstractSecurityParserTest {
+
+ private BasicPKIXValidationInformation lookup(String file) throws IOException {
+ return (BasicPKIXValidationInformation) getBean(PKIXValidationInformation.class, "trust/" + file);
+ }
+
+ @Test public void simple() throws IOException {
+ final BasicPKIXValidationInformation info = lookup("resourceValidationInfo.xml");
+ Assert.assertNull(info.getVerificationDepth());
+ Assert.assertTrue(info.getCertificates().isEmpty());
+ Assert.assertTrue(info.getCRLs().isEmpty());
+ }
+
+ @Test public void complex() throws IOException {
+ final BasicPKIXValidationInformation info = lookup("resourceValidationInfoValues.xml");
+ Assert.assertEquals(info.getVerificationDepth().intValue(), 99);
+ Assert.assertEquals(info.getCertificates().size(), 2);
+ Assert.assertEquals(info.getCRLs().size(), 1);
+ }
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXInlineParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXInlineParserTest.java
new file mode 100644
index 000000000..3c87cea9d
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXInlineParserTest.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.x509.PKIXValidationInformation;
+import org.opensaml.security.x509.impl.BasicPKIXValidationInformation;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for parsing of inline ValidationInfo
+ */
+ at SuppressWarnings("javadoc")
+public class PKIXInlineParserTest extends AbstractSecurityParserTest {
+
+ private BasicPKIXValidationInformation lookup(String file) throws IOException {
+ return (BasicPKIXValidationInformation) getBean(PKIXValidationInformation.class, "trust/" + file);
+ }
+
+ @Test public void simple() throws IOException {
+ final BasicPKIXValidationInformation info = lookup("inlineValidationInfo.xml");
+ Assert.assertNull(info.getVerificationDepth());
+ Assert.assertTrue(info.getCertificates().isEmpty());
+ Assert.assertTrue(info.getCRLs().isEmpty());
+ }
+
+ @Test(enabled=true) public void complex() throws IOException {
+ final BasicPKIXValidationInformation info = lookup("inlineValidationInfoValues.xml");
+ Assert.assertEquals(info.getVerificationDepth().intValue(), 98);
+ Assert.assertEquals(info.getCertificates().size(), 2);
+ Assert.assertEquals(info.getCRLs().size(), 1);
+ }
+
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXValidationOptionsParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXValidationOptionsParserTest.java
new file mode 100644
index 000000000..c618746cf
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXValidationOptionsParserTest.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.x509.PKIXValidationOptions;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * Test for {@link PKIXValidationOptionsParser}.
+ */
+ at SuppressWarnings("javadoc")
+public class PKIXValidationOptionsParserTest extends AbstractSecurityParserTest {
+
+
+ @Test public void simple() throws IOException {
+ PKIXValidationOptions what = getBean(PKIXValidationOptions.class, "trust/validationOptions.xml");
+
+ Assert.assertTrue(what.isProcessCredentialCRLs());
+ Assert.assertTrue(what.isProcessEmptyCRLs());
+ Assert.assertTrue(what.isProcessExpiredCRLs());
+ Assert.assertEquals(what.getDefaultVerificationDepth(), Integer.valueOf(1));
+ }
+
+ @Test public void complex() throws IOException {
+ PKIXValidationOptions what = getBean(PKIXValidationOptions.class, "trust/validationOptionsValues.xml");
+
+ Assert.assertFalse(what.isProcessCredentialCRLs());
+ Assert.assertFalse(what.isProcessEmptyCRLs());
+ Assert.assertTrue(what.isProcessExpiredCRLs());
+ Assert.assertEquals(what.getDefaultVerificationDepth(), Integer.valueOf(2));
+ }
+
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/SignatureChainingParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/SignatureChainingParserTest.java
new file mode 100644
index 000000000..56841da83
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/SignatureChainingParserTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.security.trust.TrustedCredentialTrustEngine;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.opensaml.xmlsec.signature.support.impl.ChainingSignatureTrustEngine;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for xsi:type="security:StaticExplicitKeySignature".
+ */
+ at SuppressWarnings("javadoc")
+public class SignatureChainingParserTest extends AbstractSecurityParserTest {
+
+ @Test public void simple() throws IOException, ResolverException {
+ final ChainingSignatureTrustEngine chain = getBean(ChainingSignatureTrustEngine.class, "trust/chain.xml");
+
+ Assert.assertEquals(chain.getChain().size(),2);
+
+ final TrustedCredentialTrustEngine<?> engine = (TrustedCredentialTrustEngine<?>) chain.getChain().get(1);
+
+ final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+
+ BasicX509Credential credential = (BasicX509Credential) resolver.resolveSingle(null);
+
+ Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+ Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+ Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+
+ }
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeyFactoryBeanTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeyFactoryBeanTest.java
new file mode 100644
index 000000000..ca4503135
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeyFactoryBeanTest.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.Iterator;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+import org.opensaml.security.credential.Credential;
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.security.trust.TrustEngine;
+import org.opensaml.security.trust.impl.ExplicitKeyTrustEngine;
+import org.opensaml.security.x509.X509Credential;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * Test for StaticExplicitKey factory bean.
+ */
+ at SuppressWarnings("javadoc")
+public class StaticExplicitKeyFactoryBeanTest extends AbstractSecurityParserTest {
+
+ static private String TESTPATH = "trust/staticExplicitNative.xml";
+
+ @Test public void singleKey() throws IOException, ResolverException {
+ final ExplicitKeyTrustEngine engine = (ExplicitKeyTrustEngine) getBean("staticKeySingle", TrustEngine.class, TESTPATH);
+
+ final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+ Credential credential = resolver.resolveSingle(null);
+
+ Assert.assertNotNull(credential.getPublicKey());
+ }
+
+ @Test public void singleCert() throws IOException, ResolverException {
+ final ExplicitKeyTrustEngine engine = (ExplicitKeyTrustEngine) getBean("staticX509Single", TrustEngine.class, TESTPATH);
+
+ final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+ X509Credential credential = (X509Credential) resolver.resolveSingle(null);
+
+ Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+ Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+ Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+ }
+
+ @Test public void multipleCert() throws IOException, ResolverException {
+ final ExplicitKeyTrustEngine engine = (ExplicitKeyTrustEngine) getBean("staticX509Multiple", TrustEngine.class, TESTPATH);
+
+ final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+
+ Iterator<Credential> credentials = resolver.resolve(null).iterator();
+
+ Assert.assertTrue(credentials.hasNext());
+ final X509Credential first = (X509Credential) credentials.next();
+ Assert.assertEquals(first.getEntityCertificateChain().size(), 1);
+
+ Assert.assertTrue(credentials.hasNext());
+ final X509Credential second = (X509Credential) credentials.next();
+ Assert.assertEquals(second.getEntityCertificateChain().size(), 1);
+ }
+
+ @Test public void mixed() throws IOException, ResolverException {
+ final ExplicitKeyTrustEngine engine = (ExplicitKeyTrustEngine) getBean("staticMixed", TrustEngine.class, TESTPATH);
+
+ final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+
+ Iterator<Credential> credentials = resolver.resolve(null).iterator();
+
+ Assert.assertTrue(credentials.hasNext());
+ final Credential first = credentials.next();
+ Assert.assertNotNull(first.getPublicKey());
+ Assert.assertFalse(first instanceof X509Credential);
+
+ Assert.assertTrue(credentials.hasNext());
+ final X509Credential second = (X509Credential) credentials.next();
+ Assert.assertEquals(second.getEntityCertificateChain().size(), 1);
+ Assert.assertEquals(second.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+ }
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeyParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeyParserTest.java
new file mode 100644
index 000000000..f0e55e3ae
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeyParserTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.security.trust.TrustEngine;
+import org.opensaml.security.trust.impl.ExplicitKeyTrustEngine;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for xsi:type="security:StaticExplicitKeySignature".
+ */
+ at SuppressWarnings("javadoc")
+public class StaticExplicitKeyParserTest extends AbstractSecurityParserTest {
+
+ @Test public void simple() throws IOException, ResolverException {
+ final ExplicitKeyTrustEngine engine = (ExplicitKeyTrustEngine) getBean(TrustEngine.class, "trust/staticExplicit.xml");
+
+ final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+
+ BasicX509Credential credential = (BasicX509Credential) resolver.resolveSingle(null);
+
+ Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+ Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+ Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+
+ }
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeySignatureParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeySignatureParserTest.java
new file mode 100644
index 000000000..a15cb8d3d
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeySignatureParserTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.security.trust.TrustEngine;
+import org.opensaml.security.trust.TrustedCredentialTrustEngine;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for xsi:type="security:StaticExplicitKeySignature".
+ */
+ at SuppressWarnings("javadoc")
+public class StaticExplicitKeySignatureParserTest extends AbstractSecurityParserTest {
+
+ @Test public void simple() throws IOException, ResolverException {
+ final TrustedCredentialTrustEngine<?> engine = (TrustedCredentialTrustEngine<?>) getBean(TrustEngine.class, "trust/staticExplicitSignature.xml");
+
+ final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+
+ BasicX509Credential credential = (BasicX509Credential) resolver.resolveSingle(null);
+
+ Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+ Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+ Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+
+ }
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXFactoryBeanTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXFactoryBeanTest.java
new file mode 100644
index 000000000..e8fa28717
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXFactoryBeanTest.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.Set;
+
+import org.opensaml.security.SecurityException;
+import org.opensaml.security.x509.PKIXTrustEvaluator;
+import org.opensaml.security.x509.PKIXValidationInformation;
+import org.opensaml.security.x509.PKIXValidationOptions;
+import org.opensaml.security.x509.X509Credential;
+import org.opensaml.security.x509.impl.BasicX509CredentialNameEvaluator;
+import org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator;
+import org.opensaml.security.x509.impl.PKIXX509CredentialTrustEngine;
+import org.opensaml.security.x509.impl.StaticPKIXValidationInformationResolver;
+import org.opensaml.security.x509.impl.X509CredentialNameEvaluator;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.context.support.GenericApplicationContext;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import net.shibboleth.ext.spring.context.FilesystemGenericApplicationContext;
+import net.shibboleth.ext.spring.util.SchemaTypeAwareXMLBeanDefinitionReader;
+import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
+
+/**
+ * Unit test for {@link StaticPKIXFactoryBean}.
+ */
+public class StaticPKIXFactoryBeanTest {
+
+ @Test
+ public void defaults() {
+ final GenericApplicationContext context = new FilesystemGenericApplicationContext();
+ context.setDisplayName("ApplicationContext: X509Credential");
+ final SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
+ new SchemaTypeAwareXMLBeanDefinitionReader(context);
+
+ beanDefinitionReader.loadBeanDefinitions("org/opensaml/spring/trust/static-pkix-factory-defaults.xml");
+
+ context.refresh();
+
+ final PKIXX509CredentialTrustEngine trustEngine = context.getBean("StaticPKIXX509CredentialTrustEngine",
+ PKIXX509CredentialTrustEngine.class);
+
+ Assert.assertNotNull(trustEngine);
+
+ Assert.assertTrue(StaticPKIXValidationInformationResolver.class.isInstance((trustEngine.getPKIXResolver())));
+
+ Assert.assertTrue(CertPathPKIXTrustEvaluator.class.isInstance((trustEngine.getPKIXTrustEvaluator())));
+
+ Assert.assertTrue(BasicX509CredentialNameEvaluator.class.isInstance((trustEngine.getX509CredentialNameEvaluator())));
+ }
+
+ @Test
+ public void customPropertiesSuccess() {
+ final GenericApplicationContext context = new FilesystemGenericApplicationContext();
+ context.setDisplayName("ApplicationContext: X509Credential");
+ final SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
+ new SchemaTypeAwareXMLBeanDefinitionReader(context);
+
+ beanDefinitionReader.loadBeanDefinitions("org/opensaml/spring/trust/static-pkix-factory-custom-success.xml");
+
+ context.refresh();
+
+ final PKIXX509CredentialTrustEngine trustEngine = context.getBean("StaticPKIXX509CredentialTrustEngine",
+ PKIXX509CredentialTrustEngine.class);
+
+ Assert.assertNotNull(trustEngine);
+
+ Assert.assertTrue(StaticPKIXValidationInformationResolver.class.isInstance((trustEngine.getPKIXResolver())));
+
+ Assert.assertTrue(MockPKIXTrustEvaluator.class.isInstance((trustEngine.getPKIXTrustEvaluator())));
+
+ Assert.assertTrue(MockX509CredentialNameEvaluator.class.isInstance((trustEngine.getX509CredentialNameEvaluator())));
+ }
+
+ @Test(expectedExceptions=FatalBeanException.class)
+ public void customPropertiesFailsValidation() {
+ final GenericApplicationContext context = new FilesystemGenericApplicationContext();
+ context.setDisplayName("ApplicationContext: X509Credential");
+ final SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
+ new SchemaTypeAwareXMLBeanDefinitionReader(context);
+
+ beanDefinitionReader.loadBeanDefinitions("org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml");
+
+ context.refresh();
+ }
+
+
+ //
+ // Helpers
+ //
+
+ public static class MockPKIXTrustEvaluator extends AbstractInitializableComponent implements PKIXTrustEvaluator {
+
+ /** {@inheritDoc} */
+ public boolean validate(PKIXValidationInformation validationInfo, X509Credential untrustedCredential)
+ throws SecurityException {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ public PKIXValidationOptions getPKIXValidationOptions() {
+ return null;
+ }
+
+ }
+
+ public static class MockX509CredentialNameEvaluator extends AbstractInitializableComponent implements X509CredentialNameEvaluator {
+
+ /** {@inheritDoc} */
+ public boolean evaluate(X509Credential credential, Set<String> trustedNames) throws SecurityException {
+ return false;
+ }
+
+ }
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXSignatureParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXSignatureParserTest.java
new file mode 100644
index 000000000..0a5549028
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXSignatureParserTest.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+import org.opensaml.security.trust.TrustEngine;
+import org.opensaml.security.x509.PKIXValidationInformation;
+import org.opensaml.security.x509.PKIXValidationOptions;
+import org.opensaml.security.x509.impl.BasicPKIXValidationInformation;
+import org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator;
+import org.opensaml.security.x509.impl.CertPathPKIXValidationOptions;
+import org.opensaml.security.x509.impl.StaticPKIXValidationInformationResolver;
+import org.opensaml.xmlsec.signature.support.impl.PKIXSignatureTrustEngine;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for xsi:type="security:StaticPKIXKeySignature".
+ */
+ at SuppressWarnings("javadoc")
+public class StaticPKIXSignatureParserTest extends AbstractSecurityParserTest {
+
+ @Test public void simple() throws IOException, ResolverException {
+ final PKIXSignatureTrustEngine engine =
+ (PKIXSignatureTrustEngine) getBean(TrustEngine.class, "trust/staticPKIX.xml");
+
+ Assert.assertNotNull(engine.getX509CredentialNameEvaluator());
+
+ final StaticPKIXValidationInformationResolver resolver =
+ (StaticPKIXValidationInformationResolver) engine.getPKIXResolver();
+ Assert.assertTrue(resolver.resolveTrustedNames(null).isEmpty());
+
+ final List<PKIXValidationInformation> infos = new ArrayList<>();
+ for (final PKIXValidationInformation info : resolver.resolve(null)) {
+ infos.add(info);
+ }
+ Assert.assertEquals(infos.size(), 1);
+
+ final CertPathPKIXTrustEvaluator trustEvaluator = (CertPathPKIXTrustEvaluator) engine.getPKIXTrustEvaluator();
+ final PKIXValidationOptions options = trustEvaluator.getPKIXValidationOptions();
+ Assert.assertTrue(options.isProcessCredentialCRLs());
+ Assert.assertTrue(options.isProcessEmptyCRLs());
+ Assert.assertTrue(options.isProcessExpiredCRLs());
+ Assert.assertEquals(options.getDefaultVerificationDepth().intValue(), 1);
+ }
+
+ @Test public void nameCheckDisabled() throws IOException, ResolverException {
+ final PKIXSignatureTrustEngine engine =
+ (PKIXSignatureTrustEngine) getBean(TrustEngine.class, "trust/staticPKIX-nameCheckDisabled.xml");
+
+ Assert.assertNull(engine.getX509CredentialNameEvaluator());
+
+ final StaticPKIXValidationInformationResolver resolver =
+ (StaticPKIXValidationInformationResolver) engine.getPKIXResolver();
+ Assert.assertTrue(resolver.resolveTrustedNames(null).isEmpty());
+
+ final List<PKIXValidationInformation> infos = new ArrayList<>();
+ for (final PKIXValidationInformation info : resolver.resolve(null)) {
+ infos.add(info);
+ }
+ Assert.assertEquals(infos.size(), 1);
+
+ final CertPathPKIXTrustEvaluator trustEvaluator = (CertPathPKIXTrustEvaluator) engine.getPKIXTrustEvaluator();
+ final PKIXValidationOptions options = trustEvaluator.getPKIXValidationOptions();
+ Assert.assertTrue(options.isProcessCredentialCRLs());
+ Assert.assertTrue(options.isProcessEmptyCRLs());
+ Assert.assertTrue(options.isProcessExpiredCRLs());
+ Assert.assertEquals(options.getDefaultVerificationDepth().intValue(), 1);
+ }
+
+ @Test public void values() throws IOException, ResolverException {
+ final PKIXSignatureTrustEngine engine =
+ (PKIXSignatureTrustEngine) getBean(TrustEngine.class, "trust/staticPKIXValues.xml");
+
+ Assert.assertNotNull(engine.getX509CredentialNameEvaluator());
+
+ final StaticPKIXValidationInformationResolver resolver =
+ (StaticPKIXValidationInformationResolver) engine.getPKIXResolver();
+ final Set<String> tns = resolver.resolveTrustedNames(null);
+ Assert.assertEquals(tns.size(), 3);
+ Assert.assertTrue(tns.contains("Name1"));
+ Assert.assertTrue(tns.contains("Name2"));
+ Assert.assertTrue(tns.contains("Name3"));
+
+ final List<PKIXValidationInformation> infos = new ArrayList<>();
+ for (final PKIXValidationInformation info : resolver.resolve(null)) {
+ infos.add(info);
+ }
+ Assert.assertEquals(infos.size(), 2);
+ final int firstVal = ((BasicPKIXValidationInformation) infos.get(0)).getVerificationDepth().intValue();
+ final int secondVal = ((BasicPKIXValidationInformation) infos.get(1)).getVerificationDepth().intValue();
+
+ Assert.assertTrue((98 == firstVal) || (99 == firstVal));
+ Assert.assertTrue((98 == secondVal) || (99 == secondVal));
+ Assert.assertNotEquals(firstVal, secondVal);
+
+ final CertPathPKIXTrustEvaluator trustEvaluator = (CertPathPKIXTrustEvaluator) engine.getPKIXTrustEvaluator();
+ final PKIXValidationOptions options = trustEvaluator.getPKIXValidationOptions();
+ Assert.assertFalse(options.isProcessCredentialCRLs());
+ Assert.assertFalse(options.isProcessEmptyCRLs());
+ Assert.assertFalse(options.isProcessExpiredCRLs());
+ Assert.assertEquals(options.getDefaultVerificationDepth().intValue(), 2);
+ }
+
+ @Test public void certPath() throws IOException, ResolverException {
+ final PKIXSignatureTrustEngine engine =
+ (PKIXSignatureTrustEngine) getBean(TrustEngine.class, "trust/staticPKIXValuesCertPathOpts.xml");
+
+ Assert.assertNotNull(engine.getX509CredentialNameEvaluator());
+
+ final StaticPKIXValidationInformationResolver resolver =
+ (StaticPKIXValidationInformationResolver) engine.getPKIXResolver();
+ final Set<String> tns = resolver.resolveTrustedNames(null);
+ Assert.assertEquals(tns.size(), 1);
+ Assert.assertTrue(tns.contains("Name1"));
+
+ final List<PKIXValidationInformation> infos = new ArrayList<>();
+ for (final PKIXValidationInformation info : resolver.resolve(null)) {
+ infos.add(info);
+ }
+ Assert.assertEquals(infos.size(), 1);
+ final int value = ((BasicPKIXValidationInformation) infos.get(0)).getVerificationDepth().intValue();
+
+ Assert.assertEquals(value, 99);
+
+ final CertPathPKIXTrustEvaluator trustEvaluator = (CertPathPKIXTrustEvaluator) engine.getPKIXTrustEvaluator();
+ final CertPathPKIXValidationOptions options = (CertPathPKIXValidationOptions) trustEvaluator.getPKIXValidationOptions();
+ Assert.assertFalse(options.isProcessCredentialCRLs());
+ Assert.assertFalse(options.isProcessEmptyCRLs());
+ Assert.assertFalse(options.isProcessExpiredCRLs());
+ Assert.assertEquals(options.getDefaultVerificationDepth().intValue(), 3);
+
+ Assert.assertFalse(options.isRevocationEnabled());
+ Assert.assertTrue(options.isAnyPolicyInhibited());
+ Assert.assertTrue(options.isPolicyMappingInhibited());
+ Assert.assertTrue(options.isForceRevocationEnabled());
+ Assert.assertEquals(options.getInitialPolicies().size(), 1);
+ Assert.assertTrue(options.getInitialPolicies().contains("1234"));
+ }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXX509CredentialParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXX509CredentialParserTest.java
new file mode 100644
index 000000000..529a7ddc4
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXX509CredentialParserTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements. See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+import org.opensaml.security.trust.TrustEngine;
+import org.opensaml.security.x509.PKIXValidationInformation;
+import org.opensaml.security.x509.impl.BasicPKIXValidationInformation;
+import org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator;
+import org.opensaml.security.x509.impl.CertPathPKIXValidationOptions;
+import org.opensaml.security.x509.impl.PKIXX509CredentialTrustEngine;
+import org.opensaml.security.x509.impl.StaticPKIXValidationInformationResolver;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for xsi:type="security:StaticPKIXX509CredentialParser".
+ */
+ at SuppressWarnings("javadoc")
+public class StaticPKIXX509CredentialParserTest extends AbstractSecurityParserTest {
+
+ @Test public void certPath() throws IOException, ResolverException {
+ final PKIXX509CredentialTrustEngine engine =
+ (PKIXX509CredentialTrustEngine) getBean(TrustEngine.class, "trust/staticPKIXCredentials.xml");
+
+ Assert.assertNotNull(engine.getX509CredentialNameEvaluator());
+
+ final StaticPKIXValidationInformationResolver resolver =
+ (StaticPKIXValidationInformationResolver) engine.getPKIXResolver();
+ final Set<String> tns = resolver.resolveTrustedNames(null);
+ Assert.assertEquals(tns.size(), 1);
+ Assert.assertTrue(tns.contains("Name1"));
+
+ final List<PKIXValidationInformation> infos = new ArrayList<>();
+ for (final PKIXValidationInformation info : resolver.resolve(null)) {
+ infos.add(info);
+ }
+ Assert.assertEquals(infos.size(), 1);
+ final int value = ((BasicPKIXValidationInformation) infos.get(0)).getVerificationDepth().intValue();
+
+ Assert.assertEquals(value, 99);
+
+ final CertPathPKIXTrustEvaluator trustEvaluator = (CertPathPKIXTrustEvaluator) engine.getPKIXTrustEvaluator();
+ final CertPathPKIXValidationOptions options = (CertPathPKIXValidationOptions) trustEvaluator.getPKIXValidationOptions();
+ Assert.assertFalse(options.isProcessCredentialCRLs());
+ Assert.assertFalse(options.isProcessEmptyCRLs());
+ Assert.assertFalse(options.isProcessExpiredCRLs());
+ Assert.assertEquals(options.getDefaultVerificationDepth().intValue(), 3);
+
+ Assert.assertFalse(options.isRevocationEnabled());
+ Assert.assertTrue(options.isAnyPolicyInhibited());
+ Assert.assertTrue(options.isPolicyMappingInhibited());
+ Assert.assertTrue(options.isForceRevocationEnabled());
+ Assert.assertEquals(options.getInitialPolicies().size(), 1);
+ Assert.assertTrue(options.getInitialPolicies().contains("1234"));
+ }
+
+ @Test public void nameCheckDisabled() throws IOException, ResolverException {
+ final PKIXX509CredentialTrustEngine engine =
+ (PKIXX509CredentialTrustEngine) getBean(TrustEngine.class, "trust/staticPKIXCredentials-nameCheckDisabled.xml");
+
+ Assert.assertNull(engine.getX509CredentialNameEvaluator());
+
+ final StaticPKIXValidationInformationResolver resolver =
+ (StaticPKIXValidationInformationResolver) engine.getPKIXResolver();
+ final Set<String> tns = resolver.resolveTrustedNames(null);
+ Assert.assertEquals(tns.size(), 0);
+
+ final List<PKIXValidationInformation> infos = new ArrayList<>();
+ for (final PKIXValidationInformation info : resolver.resolve(null)) {
+ infos.add(info);
+ }
+ Assert.assertEquals(infos.size(), 1);
+ final int value = ((BasicPKIXValidationInformation) infos.get(0)).getVerificationDepth().intValue();
+
+ Assert.assertEquals(value, 99);
+
+ final CertPathPKIXTrustEvaluator trustEvaluator = (CertPathPKIXTrustEvaluator) engine.getPKIXTrustEvaluator();
+ final CertPathPKIXValidationOptions options = (CertPathPKIXValidationOptions) trustEvaluator.getPKIXValidationOptions();
+ Assert.assertFalse(options.isProcessCredentialCRLs());
+ Assert.assertFalse(options.isProcessEmptyCRLs());
+ Assert.assertFalse(options.isProcessExpiredCRLs());
+ Assert.assertEquals(options.getDefaultVerificationDepth().intValue(), 3);
+
+ Assert.assertFalse(options.isRevocationEnabled());
+ Assert.assertTrue(options.isAnyPolicyInhibited());
+ Assert.assertTrue(options.isPolicyMappingInhibited());
+ Assert.assertTrue(options.isForceRevocationEnabled());
+ Assert.assertEquals(options.getInitialPolicies().size(), 1);
+ Assert.assertTrue(options.getInitialPolicies().contains("1234"));
+ }
+
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-base64.txt b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-base64.txt
new file mode 100644
index 000000000..fee2306c9
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-base64.txt
@@ -0,0 +1 @@
+3MvnCRvjjWgqazN4O2cHCw==
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-binary.data b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-binary.data
new file mode 100644
index 000000000..a1e00caa9
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-binary.data
@@ -0,0 +1 @@
+Z T�|�T��e�
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-hex.txt b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-hex.txt
new file mode 100644
index 000000000..a3c8fef1d
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-hex.txt
@@ -0,0 +1 @@
+dccbe7091be38d682a6b33783b67070b
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/bean.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/bean.xml
new file mode 100644
index 000000000..9a2d0d2d2
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/bean.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:c="http://www.springframework.org/schema/c"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+
+ default-init-method="initialize"
+ default-destroy-method="destroy">
+
+ <bean id="Credential"
+ class="org.opensaml.spring.credential.BasicX509CredentialFactoryBean"
+ p:privateKeyResource="org/opensaml/spring/credential/idp-signing.key"
+ p:certificateResource="org/opensaml/spring/credential/idp-signing.crt"
+ p:entityId="http://example.org/plain" />
+
+ <bean id="EncCredential"
+ class="org.opensaml.spring.credential.BasicX509CredentialFactoryBean"
+ p:privateKeyResource="org/opensaml/spring/credential/idp-signing.key.pass"
+ p:certificateResource="org/opensaml/spring/credential/idp-signing.crt"
+ p:privateKeyPassword="pass"
+ p:entityId="http://example.org/enc" />
+
+</beans>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/cert.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/cert.pem
new file mode 100644
index 000000000..c0df65bc9
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/cert.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+-----END CERTIFICATE-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/certificate.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/certificate.pem
new file mode 100644
index 000000000..d9e8f8606
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/certificate.pem
@@ -0,0 +1,52 @@
+-----BEGIN CERTIFICATE-----
+MIIDSTCCArKgAwIBAgIJAKg8tR5hjVM4MA0GCSqGSIb3DQEBBQUAMHcxCzAJBgNV
+BAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMK
+V2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYD
+VQQDEwtleGFtcGxlLm9yZzAeFw0wNzA4MDUxMzA4MDJaFw0xNzA4MDIxMzA4MDJa
+MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTET
+MBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJz
+aXR5MRQwEgYDVQQDEwtleGFtcGxlLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
+gYkCgYEA5zKHuD5DGPEQH+yLDMIA5M46HwJk7HxlGQ7N9WmkhaI22zXPC0UO8sY4
+AJW/8nlm0pc505iQmbgslg7/JyBemBj1sI7pOp6eCUPs7NR2mwaujXBturiRaJIe
+AX1Gjr3sO+3aLvqxUEu0PWqci4m1uc8XHQCA+PlEQQQnB9UIJwcCAwEAAaOB3DCB
+2TAdBgNVHQ4EFgQUzEhylzE4wmr4FK1lZ7zjR/KmA24wgakGA1UdIwSBoTCBnoAU
+zEhylzE4wmr4FK1lZ7zjR/KmA26he6R5MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQI
+ExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwG
+A1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYDVQQDEwtleGFtcGxlLm9y
+Z4IJAKg8tR5hjVM4MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAGfkM
+HUeWzHzsBkwTu+S2vX4gzlJPjiL3RzL40og/qyGz38P4KVg8IQvsGDjs1VFzzcAJ
+I5ULnSocUOTk5sCTjDKT6VILhgAYJ1jnqIo7Z+VC1r3AS9cSDakzqWTc19EFKxEw
+6jeBWaqyykdSiVhCAmG5AJsvk+K032zjkWWMo+0=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFmjCCBIKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTSW5Db21tb24gRmVkZXJhdGlvbjEpMCcGA1UEAxMgSW5Db21tb24g
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwMzMwMjAzNDAwWhcNMTQwMzI5
+MjAzNDAwWjBWMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTSW5Db21tb24gRmVkZXJh
+dGlvbjEpMCcGA1UEAxMgSW5Db21tb24gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRGjKsUM2QAupLAaWx82/C
+WPalKjKFY8UPmz0T3gf7tJPztTy1Zq8pD0WFRLcQeSBKZGCu8upe8X966b6TZ5yu
+oUDA754If0DWismuHNoMgRR/l0UvZmPWDGRWd3NBTB8/soLA4EbqFf5Xq8MOJKhP
+tzcDR33gtaAb3oilZ+ZTpnhTFFrn/qXrAKcSDBpuW2JRpi3xaF/hTPI097oUShOz
+D1Zj21UYLA6iSFVN+1wlfwilf2KFNK/+zbkCge6wgipZyXxaOAam6ncqmkxy+hy/
+OiJMmdB+6xkO0xXSBUUcqxJrOcUQhA1vntgb3q5zOJISXhC4RAReA0HyBp/wd0iD
+AgMBAAGjggJxMIICbTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUky3IYRitY+ObZbOd3Y2TuufKY0UwfgYDVR0jBHcwdYAUky3IYRit
+Y+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYDVQQKExNJbkNv
+bW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eYIBADCBugYIKwYBBQUHAQEEga0wgaowgacGCCsGAQUFBzAChoGa
+aHR0cDovL2luY29tbW9uY2ExLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdl
+L2NlcnRzL2NhLWNlcnRzLnA3YgoJCUNBIElzc3VlcnMgLSBVUkk6aHR0cDovL2lu
+Y29tbW9uY2EyLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdlL2NlcnRzL2Nh
+LWNlcnRzLnA3YjCBjQYDVR0fBIGFMIGCMD+gPaA7hjlodHRwOi8vaW5jb21tb25j
+cmwxLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvY3JsL2VlY3Jscy5jcmwwP6A9oDuG
+OWh0dHA6Ly9pbmNvbW1vbmNybDIuaW5jb21tb25mZWRlcmF0aW9uLm9yZy9jcmwv
+ZWVjcmxzLmNybDBeBgNVHSAEVzBVMFMGCysGAQQBriMBBAEBMEQwQgYIKwYBBQUH
+AgEWNmh0dHA6Ly9pbmNvbW1vbmNhLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvcHJh
+Y3RpY2VzLnBkZjANBgkqhkiG9w0BAQUFAAOCAQEAZfgKUPA+Ky+Ou/vclMlFTMlU
+GspfbNSdG/fmIq+E/Lv1d2c73Am1zGhOpxgdkM8SE+BPnXW2rl71/N8gaqwgBBxk
+pwn410siumxlDTwV3HoVFvCGWylNy9o8OE1LyTCqfo8PRwrMzhwcagDgD813BIyj
+uJg/JQz1LnHMocIW/JligloSIzF1O435/+ckfWXQsmBIhvV5TmA3ZrcycrI1cHGE
+ZqrCXL0FMZLSr+Vady/tFbVojqI8pSubSMxNkZectePTBjVj1Qeb4hmG8jRv/fwy
+1Iw6OFH8RKny8nQaO5mOe/fF/swEsMVU9TDpvLIgbhTwnP7Nhfotgaxf5wG8WA==
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/crl.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/crl.pem
new file mode 100644
index 000000000..f8036cef1
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/crl.pem
@@ -0,0 +1,19 @@
+-----BEGIN X509 CRL-----
+MIIDBjCCAe4CAQEwDQYJKoZIhvcNAQEEBQAwVjELMAkGA1UEBhMCVVMxHDAaBgNV
+BAoTE0luQ29tbW9uIEZlZGVyYXRpb24xKTAnBgNVBAMTIEluQ29tbW9uIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5Fw0wNzA4MDMxNDE0NDhaFw0wNzA5MDIxNDE0NDha
+MIHdMBICAQIXDTA0MDMzMTE5NDk0NFowEgIBDhcNMDQwOTE3MTkzMTUxWjASAgEP
+Fw0wNDA5MTcxOTMyMTRaMBICARYXDTA1MDMyMjE3MTYyMFowEgIBHBcNMDUwMjAx
+MTkyOTUxWjASAgE+Fw0wNjA0MDcxNjM1MzFaMBICAUAXDTA2MDQwNzE2MzQ1NFow
+EgIBQRcNMDYwNDEwMTcyMjE1WjASAgFWFw0wNjA3MjAxNzIyMzVaMBICAW8XDTA2
+MTIxOTIwMTQxMVowEwICAIwXDTA3MDMyOTIxMjE0N1qggYMwgYAwfgYDVR0jBHcw
+dYAUky3IYRitY+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYD
+VQQKExNJbkNvbW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eYIBADANBgkqhkiG9w0BAQQFAAOCAQEAeCvRTq70
+RJxkxgbV+crqhN6oh3k974GGXhOxYDTTGjYbhK8JnCXkt1uJcnGfl1xyqrozoSrl
+oxoBUmStA8vVqYwtO/FfGpnCyfOG9H2/rAkzbqwr/EXO+MqSd8e1AIJho97i/QSs
+FWp40h7GeanmiZXL6bc4o9cKb0ROtc1n2nYHkLXptf9bFHte2Z/RhbUr8KaPU4b9
+T9PW9a2Z7Oc4BDHpEUcljZL0AlO6mGI2RtDB9RdrtRY6M9YQbBwUcV9r+/+ylfZY
+ugMRDTNUqL72hHKJgmbnfc0CmkcZKHOIGXdGCIX6ewNsLOQnlFAQEVyojQqbzT8w
+s6E8aj6AzPhKyw==
+-----END X509 CRL-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.crt b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.crt
new file mode 100644
index 000000000..c0df65bc9
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.crt
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+-----END CERTIFICATE-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.key b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.key
new file mode 100644
index 000000000..951462f0d
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRm
+Skki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX6
+7QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqad
+rHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYi
+dNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+
+zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABAoIBAHG6nLv13zmTdS5a
+UrX4qNPNVgryxs+N4kw51iPqQeFLGVvPB3ZtHSz46+SkhQEJHu37mtqCo3IijRZL
+rIhtIIG8FG3U18sBXNJgiCN9J26ggB2RI3DvyMxww5X6FOcWGjBkEFGtJaE6n//Y
+EbWnO+oxyC+j7DMZVoo2+MBYH8LHPXpMPFPhYbf12LpHY+WeNgX/eemMTlSylBln
+lfhySCtpLcgY7+juYlXaZ9Y1z37QZBcP6yYLTnXJVlhY1KcULh+/PUnmzVpHbkwU
+v/yQiFGFsve1ROp0ztB6sFufLnvGcTa3T1Oeza9ZaX/zjbMbGp3qjSGoknS23U0Q
+ZotRB+ECgYEA9EmvBYLWgEayOlZPcBwKZ3Qrwf9ip3xmtubrf9byIozEeQTKvHmA
+UvK5dKN1pwK0gTaWk5aq+n64HtwJ0+pO4bV32TJJlV/la4xd7wHdH5+S5cdQjd/r
+tuxyejp5FhqT+x2rKibskEeFKhfgIIolpkcNFIKc9xa3/VBOWPxV19kCgYEAz4vl
+xJhD8Cf97bm5hemiJPt2eQMCTGCE39O4UaY6xi5lINoySoh8qd2e59nnneG4YaNp
+tHU23oh00m68Jx8b7wMFliQ/J59lxAkfP262EkBqf/VOAVXQo/iaA8HSwq3Hfwt5
+0F4HMQEfB6qf7/LGvFHTQ8+Wn1upZGaYP1YAghsCgYBe3FILmNAExe8luihkx26+
+15y6W5qKoUMdmTQv0175TaJpwBOd9qx/CWQ8x9DDBsjjODhmnWZNmXGUAiwKz3zM
+JvSgMefjCncDOWGskxOz2PppIenE/gQBZ3XYwuYMUEvQgqfZ2X2ZVTx/qP/Ogva1
+x/drVIDxbjAKPOn/ohUPmQKBgQChW5qfZeIr7Gu3TxW1zxaIuhg5rOU0jDXB7tD2
+ac54Fcn56KoA2GxThEHu77LrRHodLvcXnamzCVQJ5p3RrJYDFM5bFIMlQv/TkWQB
+5QkY14v1P7oNv7IeSUE0epRpVsIrO7jRDsl4h+6f/z+pRY7NCrC9n77y1ki0Di9/
+zlVG0QKBgFXQkO/bf0Qs3COPWUs5nHyQ/sR0ptx1jrFDSjCdGvBC7NrDlwNP3894
+EHCUTrEHhjtAGVzyZakZ6PLAN9cf86N1QhvOdj/oasL5vddWyFK74x2/mtp59VOU
+LaCxnnbG4JoSVX96BSzUFbtRrQbf2+t5ZON9K12IPIxstMkF2j8u
+-----END RSA PRIVATE KEY-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.key.pass b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.key.pass
new file mode 100644
index 000000000..cde1772f7
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.key.pass
@@ -0,0 +1,30 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: AES-256-CBC,167811113CA00D40A7A46A79F0133598
+
+lzqV3Xcehk1mnsq4ZRXqiGZXIhYPWA7KqjqJYEHd10JvJoNUwZ7l6VmyZUtny1Xq
+nPPLjWsZ5rOVQkULOX/ZCmXCAW3YgvoIXmdjcenRlZTlbi7vNqongiNGgRleWRlS
+V/E+KrQXlt0jfV1KdW/PDe712mytL7akWoIE39rI0Z78EhD5YfGsA6J6azLmB5zS
+Ffu+wUfND7/gTR3roVlj8Vs1GWxdyNNLI3yUnK6aRd8zO/eTeTcMullSRpT1ORsI
+qhEMfTIBhG+yqC+NhDv1UJ8r8N6jiD63ciKwrt31SOGamdZNRdgxm1sCOcH/akN4
+w9DStPCx809gw46g/ZAi2V2sa0FguS8Jed/LFGwHG/6FVK/nLONzdFIzNF4gZ+B0
+rIPhrdK2kWpEHbMzPZG2KQack9mDv63HNTAJ8Xu1Sf9oHjJyEpdR7bczS+WeZNjd
+YyM6fR7z9n+UWhqa2+2VtAX5KsnNy5BP1SI2h3rVdpW7+hZO74O31Jj6j0QFe0ks
+e20X3ldx/EPJpJunLv46wLsSEoxfuooFj0bxpPEIjb76q9jOXJHr7M+57pdH6Z17
+lPZQ+nCUvUyfIDZ66EfMYpR6nGpYizhpRlvc5U35sU1ZEtngKwJ1rcwFkYD6THKG
+3Y+UVXd9Ft7EbuI7ArB3MOEsOgrw37IvIT3bAI3pvmdezs6H+j5cfb4F7cIGVXWM
+GB00ahK+qNnL0TaC2+qKuGT4bCxeUYkf8fY21JDnIVpZotjeau5qE32AfjWTjPBJ
+RRTyzVvAS3IjeA/LvsMVailUhZTv0sbgudGh14GKp1HWwLQKs4SXAgGCNCNEOaWu
+vKQT2srL5v0d9SBrVhZBi2u1zIiTREy8JIucX2fNvaDPJ9ZJDqxcEVZUnfaXui0u
+y0cinJ5OJQKM99hK6jVimchdJ+viGc4RRZPatkY/ZSiISJwVtrF/VbsAGN45SI+9
+GbAAD4PKOPDxeQ7qMck/OHQAFi3gUDeRsw//13lHOd3KvsWFQIuOcKJPusdU4jJV
+vBUBVtAJxlESJbjfyN1z6vM8mhm5k63apTuSDmzJfU9hMv7eKV7PIhH48RBNqtWl
+atTukx4eex56Jv54u+kKMVZC8AkrCukYrdho+QVdXJ9J0ZqGW0o9BscE4qBpm16K
+/7EL9IfmqZPK5JyxAJPINYeuBu8RPLhbRDFXCr9hMI1VX24O6S3jJWcQmAU8kOki
+UhnYwOUS98cgecyuLmEnzdvogQXFt81jrfFBNLoQ6v/SS1BIJpkDzTWAz+1qjKpR
+1IFdL8omj9SqVPHelUC5s0LKmhI6NLSC/RGFlSaAJ5FcbPTTdaNKH9dDrfQ+yylN
+bINRkbkWBrsVtMdw42Rba4WTSU7iNFQ8/UdNnHOLmfz4yR4x/g++8YusJys4OfD5
+rxr6Y8bAkhO/ebO1ERGmubZQO4AmdLllNXvgfxjY0M4Mpq6DCMLSFfz5Wc+lpX0E
+5ZRDbOBPZcGjJwJKXDDWPAQ95nbHotg/wNy+MeVXylpPgg+NCncdxqikIb/5gx91
+loYi7X4XgaXf6J4VPZDcaQiQul8YLaOk/BCMLopAGIzT+cDxsOi/zKkAICuuMiIn
+-----END RSA PRIVATE KEY-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineCertOnly.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineCertOnly.xml
new file mode 100644
index 000000000..559000881
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineCertOnly.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:X509Inline">
+ <security:Certificate>
+ MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+ BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+ aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+ MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+ ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+ CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+ x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+ lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+ DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+ J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+ T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+ p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+ 0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+ BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+ MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+ BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+ 0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+ 8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+ 1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+ i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+ </security:Certificate>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineKeyCertCrl.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineKeyCertCrl.xml
new file mode 100644
index 000000000..a0d55070b
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineKeyCertCrl.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:X509Inline">
+ <security:PrivateKey>
+ MIIEowIBAAKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRm
+ Skki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX6
+ 7QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqad
+ rHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYi
+ dNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+
+ zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABAoIBAHG6nLv13zmTdS5a
+ UrX4qNPNVgryxs+N4kw51iPqQeFLGVvPB3ZtHSz46+SkhQEJHu37mtqCo3IijRZL
+ rIhtIIG8FG3U18sBXNJgiCN9J26ggB2RI3DvyMxww5X6FOcWGjBkEFGtJaE6n//Y
+ EbWnO+oxyC+j7DMZVoo2+MBYH8LHPXpMPFPhYbf12LpHY+WeNgX/eemMTlSylBln
+ lfhySCtpLcgY7+juYlXaZ9Y1z37QZBcP6yYLTnXJVlhY1KcULh+/PUnmzVpHbkwU
+ v/yQiFGFsve1ROp0ztB6sFufLnvGcTa3T1Oeza9ZaX/zjbMbGp3qjSGoknS23U0Q
+ ZotRB+ECgYEA9EmvBYLWgEayOlZPcBwKZ3Qrwf9ip3xmtubrf9byIozEeQTKvHmA
+ UvK5dKN1pwK0gTaWk5aq+n64HtwJ0+pO4bV32TJJlV/la4xd7wHdH5+S5cdQjd/r
+ tuxyejp5FhqT+x2rKibskEeFKhfgIIolpkcNFIKc9xa3/VBOWPxV19kCgYEAz4vl
+ xJhD8Cf97bm5hemiJPt2eQMCTGCE39O4UaY6xi5lINoySoh8qd2e59nnneG4YaNp
+ tHU23oh00m68Jx8b7wMFliQ/J59lxAkfP262EkBqf/VOAVXQo/iaA8HSwq3Hfwt5
+ 0F4HMQEfB6qf7/LGvFHTQ8+Wn1upZGaYP1YAghsCgYBe3FILmNAExe8luihkx26+
+ 15y6W5qKoUMdmTQv0175TaJpwBOd9qx/CWQ8x9DDBsjjODhmnWZNmXGUAiwKz3zM
+ JvSgMefjCncDOWGskxOz2PppIenE/gQBZ3XYwuYMUEvQgqfZ2X2ZVTx/qP/Ogva1
+ x/drVIDxbjAKPOn/ohUPmQKBgQChW5qfZeIr7Gu3TxW1zxaIuhg5rOU0jDXB7tD2
+ ac54Fcn56KoA2GxThEHu77LrRHodLvcXnamzCVQJ5p3RrJYDFM5bFIMlQv/TkWQB
+ 5QkY14v1P7oNv7IeSUE0epRpVsIrO7jRDsl4h+6f/z+pRY7NCrC9n77y1ki0Di9/
+ zlVG0QKBgFXQkO/bf0Qs3COPWUs5nHyQ/sR0ptx1jrFDSjCdGvBC7NrDlwNP3894
+ EHCUTrEHhjtAGVzyZakZ6PLAN9cf86N1QhvOdj/oasL5vddWyFK74x2/mtp59VOU
+ LaCxnnbG4JoSVX96BSzUFbtRrQbf2+t5ZON9K12IPIxstMkF2j8u
+ </security:PrivateKey>
+ <security:Certificate>
+ MIIDSTCCArKgAwIBAgIJAKg8tR5hjVM4MA0GCSqGSIb3DQEBBQUAMHcxCzAJBgNV
+ BAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMK
+ V2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYD
+ VQQDEwtleGFtcGxlLm9yZzAeFw0wNzA4MDUxMzA4MDJaFw0xNzA4MDIxMzA4MDJa
+ MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTET
+ MBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJz
+ aXR5MRQwEgYDVQQDEwtleGFtcGxlLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
+ gYkCgYEA5zKHuD5DGPEQH+yLDMIA5M46HwJk7HxlGQ7N9WmkhaI22zXPC0UO8sY4
+ AJW/8nlm0pc505iQmbgslg7/JyBemBj1sI7pOp6eCUPs7NR2mwaujXBturiRaJIe
+ AX1Gjr3sO+3aLvqxUEu0PWqci4m1uc8XHQCA+PlEQQQnB9UIJwcCAwEAAaOB3DCB
+ 2TAdBgNVHQ4EFgQUzEhylzE4wmr4FK1lZ7zjR/KmA24wgakGA1UdIwSBoTCBnoAU
+ zEhylzE4wmr4FK1lZ7zjR/KmA26he6R5MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQI
+ ExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwG
+ A1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYDVQQDEwtleGFtcGxlLm9y
+ Z4IJAKg8tR5hjVM4MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAGfkM
+ HUeWzHzsBkwTu+S2vX4gzlJPjiL3RzL40og/qyGz38P4KVg8IQvsGDjs1VFzzcAJ
+ I5ULnSocUOTk5sCTjDKT6VILhgAYJ1jnqIo7Z+VC1r3AS9cSDakzqWTc19EFKxEw
+ 6jeBWaqyykdSiVhCAmG5AJsvk+K032zjkWWMo+0=
+ </security:Certificate>
+ <security:Certificate>
+ MIIFmjCCBIKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJVUzEc
+ MBoGA1UEChMTSW5Db21tb24gRmVkZXJhdGlvbjEpMCcGA1UEAxMgSW5Db21tb24g
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwMzMwMjAzNDAwWhcNMTQwMzI5
+ MjAzNDAwWjBWMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTSW5Db21tb24gRmVkZXJh
+ dGlvbjEpMCcGA1UEAxMgSW5Db21tb24gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRGjKsUM2QAupLAaWx82/C
+ WPalKjKFY8UPmz0T3gf7tJPztTy1Zq8pD0WFRLcQeSBKZGCu8upe8X966b6TZ5yu
+ oUDA754If0DWismuHNoMgRR/l0UvZmPWDGRWd3NBTB8/soLA4EbqFf5Xq8MOJKhP
+ tzcDR33gtaAb3oilZ+ZTpnhTFFrn/qXrAKcSDBpuW2JRpi3xaF/hTPI097oUShOz
+ D1Zj21UYLA6iSFVN+1wlfwilf2KFNK/+zbkCge6wgipZyXxaOAam6ncqmkxy+hy/
+ OiJMmdB+6xkO0xXSBUUcqxJrOcUQhA1vntgb3q5zOJISXhC4RAReA0HyBp/wd0iD
+ AgMBAAGjggJxMIICbTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+ BgNVHQ4EFgQUky3IYRitY+ObZbOd3Y2TuufKY0UwfgYDVR0jBHcwdYAUky3IYRit
+ Y+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYDVQQKExNJbkNv
+ bW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0aWZpY2F0aW9u
+ IEF1dGhvcml0eYIBADCBugYIKwYBBQUHAQEEga0wgaowgacGCCsGAQUFBzAChoGa
+ aHR0cDovL2luY29tbW9uY2ExLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdl
+ L2NlcnRzL2NhLWNlcnRzLnA3YgoJCUNBIElzc3VlcnMgLSBVUkk6aHR0cDovL2lu
+ Y29tbW9uY2EyLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdlL2NlcnRzL2Nh
+ LWNlcnRzLnA3YjCBjQYDVR0fBIGFMIGCMD+gPaA7hjlodHRwOi8vaW5jb21tb25j
+ cmwxLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvY3JsL2VlY3Jscy5jcmwwP6A9oDuG
+ OWh0dHA6Ly9pbmNvbW1vbmNybDIuaW5jb21tb25mZWRlcmF0aW9uLm9yZy9jcmwv
+ ZWVjcmxzLmNybDBeBgNVHSAEVzBVMFMGCysGAQQBriMBBAEBMEQwQgYIKwYBBQUH
+ AgEWNmh0dHA6Ly9pbmNvbW1vbmNhLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvcHJh
+ Y3RpY2VzLnBkZjANBgkqhkiG9w0BAQUFAAOCAQEAZfgKUPA+Ky+Ou/vclMlFTMlU
+ GspfbNSdG/fmIq+E/Lv1d2c73Am1zGhOpxgdkM8SE+BPnXW2rl71/N8gaqwgBBxk
+ pwn410siumxlDTwV3HoVFvCGWylNy9o8OE1LyTCqfo8PRwrMzhwcagDgD813BIyj
+ uJg/JQz1LnHMocIW/JligloSIzF1O435/+ckfWXQsmBIhvV5TmA3ZrcycrI1cHGE
+ ZqrCXL0FMZLSr+Vady/tFbVojqI8pSubSMxNkZectePTBjVj1Qeb4hmG8jRv/fwy
+ 1Iw6OFH8RKny8nQaO5mOe/fF/swEsMVU9TDpvLIgbhTwnP7Nhfotgaxf5wG8WA==
+ </security:Certificate>
+ <security:Certificate entityCertificate="true">
+ MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+ BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+ aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+ MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+ ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+ CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+ x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+ lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+ DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+ J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+ T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+ p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+ 0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+ BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+ MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+ BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+ 0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+ 8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+ 1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+ i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+ </security:Certificate>
+ <security:CRL>
+ MIIDBjCCAe4CAQEwDQYJKoZIhvcNAQEEBQAwVjELMAkGA1UEBhMCVVMxHDAaBgNV
+ BAoTE0luQ29tbW9uIEZlZGVyYXRpb24xKTAnBgNVBAMTIEluQ29tbW9uIENlcnRp
+ ZmljYXRpb24gQXV0aG9yaXR5Fw0wNzA4MDMxNDE0NDhaFw0wNzA5MDIxNDE0NDha
+ MIHdMBICAQIXDTA0MDMzMTE5NDk0NFowEgIBDhcNMDQwOTE3MTkzMTUxWjASAgEP
+ Fw0wNDA5MTcxOTMyMTRaMBICARYXDTA1MDMyMjE3MTYyMFowEgIBHBcNMDUwMjAx
+ MTkyOTUxWjASAgE+Fw0wNjA0MDcxNjM1MzFaMBICAUAXDTA2MDQwNzE2MzQ1NFow
+ EgIBQRcNMDYwNDEwMTcyMjE1WjASAgFWFw0wNjA3MjAxNzIyMzVaMBICAW8XDTA2
+ MTIxOTIwMTQxMVowEwICAIwXDTA3MDMyOTIxMjE0N1qggYMwgYAwfgYDVR0jBHcw
+ dYAUky3IYRitY+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYD
+ VQQKExNJbkNvbW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0
+ aWZpY2F0aW9uIEF1dGhvcml0eYIBADANBgkqhkiG9w0BAQQFAAOCAQEAeCvRTq70
+ RJxkxgbV+crqhN6oh3k974GGXhOxYDTTGjYbhK8JnCXkt1uJcnGfl1xyqrozoSrl
+ oxoBUmStA8vVqYwtO/FfGpnCyfOG9H2/rAkzbqwr/EXO+MqSd8e1AIJho97i/QSs
+ FWp40h7GeanmiZXL6bc4o9cKb0ROtc1n2nYHkLXptf9bFHte2Z/RhbUr8KaPU4b9
+ T9PW9a2Z7Oc4BDHpEUcljZL0AlO6mGI2RtDB9RdrtRY6M9YQbBwUcV9r+/+ylfZY
+ ugMRDTNUqL72hHKJgmbnfc0CmkcZKHOIGXdGCIX6ewNsLOQnlFAQEVyojQqbzT8w
+ s6E8aj6AzPhKyw==
+ </security:CRL>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlinePublicOnly.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlinePublicOnly.xml
new file mode 100644
index 000000000..4fc9f0e7c
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlinePublicOnly.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:BasicInline">
+ <security:PublicKey>
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxg0TyQAP/tIvOH89EtaX
+uRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/
+LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88
+NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbh
+nR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3
+E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn1
+4wIDAQAB
+</security:PublicKey>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlinePublicPrivate.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlinePublicPrivate.xml
new file mode 100644
index 000000000..e270c0edb
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlinePublicPrivate.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:BasicInline">
+ <security:PrivateKey >
+
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDGDRPJAA/+0i84
+fz0S1pe5FGfxJjNOPtbVNs1jhW8GahuORGZKSSLiEf3HixCmLrfnCfpa1dM38U02
+aRMrc38uymYFbF9lL6f5xzsjzYTnK8IA9frtCxmCqCCWnZbl28r8WwwwJLpfpJWr
+MEsw/zw16dcrFj4czEyzSxPRQpiHVwASpp2sdEE7rloMFyblrSwFVi30rqmBo4eu
+n/NIhuGdHm0UUuMFu0WS0OkcvcB0YEfc5iJ00YoE7e0ncyzst4pewzT7Rjg/718d
+kg0vZfcTY3oZWcqzk9lOD2w/QW0ikBtib/7MLHtiPURP8SvyYN3q01UZJCyf2znF
+QHAaqfXjAgMBAAECggEAcbqcu/XfOZN1LlpStfio081WCvLGz43iTDnWI+pB4UsZ
+W88Hdm0dLPjr5KSFAQke7fua2oKjciKNFkusiG0ggbwUbdTXywFc0mCII30nbqCA
+HZEjcO/IzHDDlfoU5xYaMGQQUa0loTqf/9gRtac76jHIL6PsMxlWijb4wFgfwsc9
+ekw8U+Fht/XYukdj5Z42Bf956YxOVLKUGWeV+HJIK2ktyBjv6O5iVdpn1jXPftBk
+Fw/rJgtOdclWWFjUpxQuH789SebNWkduTBS//JCIUYWy97VE6nTO0HqwW58ue8Zx
+NrdPU57Nr1lpf/ONsxsaneqNIaiSdLbdTRBmi1EH4QKBgQD0Sa8FgtaARrI6Vk9w
+HApndCvB/2KnfGa25ut/1vIijMR5BMq8eYBS8rl0o3WnArSBNpaTlqr6frge3AnT
+6k7htXfZMkmVX+VrjF3vAd0fn5Llx1CN3+u27HJ6OnkWGpP7HasqJuyQR4UqF+Ag
+iiWmRw0Ugpz3Frf9UE5Y/FXX2QKBgQDPi+XEmEPwJ/3tubmF6aIk+3Z5AwJMYITf
+07hRpjrGLmUg2jJKiHyp3Z7n2eed4bhho2m0dTbeiHTSbrwnHxvvAwWWJD8nn2XE
+CR8/brYSQGp/9U4BVdCj+JoDwdLCrcd/C3nQXgcxAR8Hqp/v8sa8UdNDz5afW6lk
+Zpg/VgCCGwKBgF7cUguY0ATF7yW6KGTHbr7XnLpbmoqhQx2ZNC/TXvlNomnAE532
+rH8JZDzH0MMGyOM4OGadZk2ZcZQCLArPfMwm9KAx5+MKdwM5YayTE7PY+mkh6cT+
+BAFnddjC5gxQS9CCp9nZfZlVPH+o/86C9rXH92tUgPFuMAo86f+iFQ+ZAoGBAKFb
+mp9l4ivsa7dPFbXPFoi6GDms5TSMNcHu0PZpzngVyfnoqgDYbFOEQe7vsutEeh0u
+9xedqbMJVAnmndGslgMUzlsUgyVC/9ORZAHlCRjXi/U/ug2/sh5JQTR6lGlWwis7
+uNEOyXiH7p//P6lFjs0KsL2fvvLWSLQOL3/OVUbRAoGAVdCQ79t/RCzcI49ZSzmc
+fJD+xHSm3HWOsUNKMJ0a8ELs2sOXA0/fz3gQcJROsQeGO0AZXPJlqRno8sA31x/z
+o3VCG852P+hqwvm911bIUrvjHb+a2nn1U5QtoLGedsbgmhJVf3oFLNQVu1GtBt/b
+63lk430rXYg8jGy0yQXaPy4=
+
+ </security:PrivateKey>
+ <security:PublicKey>
+
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxg0TyQAP/tIvOH89EtaX
+uRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/
+LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88
+NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbh
+nR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3
+E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn1
+4wIDAQAB
+
+ </security:PublicKey>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineWrongCert.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineWrongCert.xml
new file mode 100644
index 000000000..ec0486538
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineWrongCert.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:X509Inline">
+ <security:PrivateKey>
+MIIEowIBAAKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRm
+Skki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX6
+7QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqad
+rHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYi
+dNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+
+zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABAoIBAHG6nLv13zmTdS5a
+UrX4qNPNVgryxs+N4kw51iPqQeFLGVvPB3ZtHSz46+SkhQEJHu37mtqCo3IijRZL
+rIhtIIG8FG3U18sBXNJgiCN9J26ggB2RI3DvyMxww5X6FOcWGjBkEFGtJaE6n//Y
+EbWnO+oxyC+j7DMZVoo2+MBYH8LHPXpMPFPhYbf12LpHY+WeNgX/eemMTlSylBln
+lfhySCtpLcgY7+juYlXaZ9Y1z37QZBcP6yYLTnXJVlhY1KcULh+/PUnmzVpHbkwU
+v/yQiFGFsve1ROp0ztB6sFufLnvGcTa3T1Oeza9ZaX/zjbMbGp3qjSGoknS23U0Q
+ZotRB+ECgYEA9EmvBYLWgEayOlZPcBwKZ3Qrwf9ip3xmtubrf9byIozEeQTKvHmA
+UvK5dKN1pwK0gTaWk5aq+n64HtwJ0+pO4bV32TJJlV/la4xd7wHdH5+S5cdQjd/r
+tuxyejp5FhqT+x2rKibskEeFKhfgIIolpkcNFIKc9xa3/VBOWPxV19kCgYEAz4vl
+xJhD8Cf97bm5hemiJPt2eQMCTGCE39O4UaY6xi5lINoySoh8qd2e59nnneG4YaNp
+tHU23oh00m68Jx8b7wMFliQ/J59lxAkfP262EkBqf/VOAVXQo/iaA8HSwq3Hfwt5
+0F4HMQEfB6qf7/LGvFHTQ8+Wn1upZGaYP1YAghsCgYBe3FILmNAExe8luihkx26+
+15y6W5qKoUMdmTQv0175TaJpwBOd9qx/CWQ8x9DDBsjjODhmnWZNmXGUAiwKz3zM
+JvSgMefjCncDOWGskxOz2PppIenE/gQBZ3XYwuYMUEvQgqfZ2X2ZVTx/qP/Ogva1
+x/drVIDxbjAKPOn/ohUPmQKBgQChW5qfZeIr7Gu3TxW1zxaIuhg5rOU0jDXB7tD2
+ac54Fcn56KoA2GxThEHu77LrRHodLvcXnamzCVQJ5p3RrJYDFM5bFIMlQv/TkWQB
+5QkY14v1P7oNv7IeSUE0epRpVsIrO7jRDsl4h+6f/z+pRY7NCrC9n77y1ki0Di9/
+zlVG0QKBgFXQkO/bf0Qs3COPWUs5nHyQ/sR0ptx1jrFDSjCdGvBC7NrDlwNP3894
+EHCUTrEHhjtAGVzyZakZ6PLAN9cf86N1QhvOdj/oasL5vddWyFK74x2/mtp59VOU
+LaCxnnbG4JoSVX96BSzUFbtRrQbf2+t5ZON9K12IPIxstMkF2j8u
+
+</security:PrivateKey>
+ <security:Certificate>
+MIIDSTCCArKgAwIBAgIJAKg8tR5hjVM4MA0GCSqGSIb3DQEBBQUAMHcxCzAJBgNV
+BAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMK
+V2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYD
+VQQDEwtleGFtcGxlLm9yZzAeFw0wNzA4MDUxMzA4MDJaFw0xNzA4MDIxMzA4MDJa
+MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTET
+MBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJz
+aXR5MRQwEgYDVQQDEwtleGFtcGxlLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
+gYkCgYEA5zKHuD5DGPEQH+yLDMIA5M46HwJk7HxlGQ7N9WmkhaI22zXPC0UO8sY4
+AJW/8nlm0pc505iQmbgslg7/JyBemBj1sI7pOp6eCUPs7NR2mwaujXBturiRaJIe
+AX1Gjr3sO+3aLvqxUEu0PWqci4m1uc8XHQCA+PlEQQQnB9UIJwcCAwEAAaOB3DCB
+2TAdBgNVHQ4EFgQUzEhylzE4wmr4FK1lZ7zjR/KmA24wgakGA1UdIwSBoTCBnoAU
+zEhylzE4wmr4FK1lZ7zjR/KmA26he6R5MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQI
+ExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwG
+A1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYDVQQDEwtleGFtcGxlLm9y
+Z4IJAKg8tR5hjVM4MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAGfkM
+HUeWzHzsBkwTu+S2vX4gzlJPjiL3RzL40og/qyGz38P4KVg8IQvsGDjs1VFzzcAJ
+I5ULnSocUOTk5sCTjDKT6VILhgAYJ1jnqIo7Z+VC1r3AS9cSDakzqWTc19EFKxEw
+6jeBWaqyykdSiVhCAmG5AJsvk+K032zjkWWMo+0=
+</security:Certificate>
+<security:Certificate>
+MIIFmjCCBIKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTSW5Db21tb24gRmVkZXJhdGlvbjEpMCcGA1UEAxMgSW5Db21tb24g
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwMzMwMjAzNDAwWhcNMTQwMzI5
+MjAzNDAwWjBWMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTSW5Db21tb24gRmVkZXJh
+dGlvbjEpMCcGA1UEAxMgSW5Db21tb24gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRGjKsUM2QAupLAaWx82/C
+WPalKjKFY8UPmz0T3gf7tJPztTy1Zq8pD0WFRLcQeSBKZGCu8upe8X966b6TZ5yu
+oUDA754If0DWismuHNoMgRR/l0UvZmPWDGRWd3NBTB8/soLA4EbqFf5Xq8MOJKhP
+tzcDR33gtaAb3oilZ+ZTpnhTFFrn/qXrAKcSDBpuW2JRpi3xaF/hTPI097oUShOz
+D1Zj21UYLA6iSFVN+1wlfwilf2KFNK/+zbkCge6wgipZyXxaOAam6ncqmkxy+hy/
+OiJMmdB+6xkO0xXSBUUcqxJrOcUQhA1vntgb3q5zOJISXhC4RAReA0HyBp/wd0iD
+AgMBAAGjggJxMIICbTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUky3IYRitY+ObZbOd3Y2TuufKY0UwfgYDVR0jBHcwdYAUky3IYRit
+Y+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYDVQQKExNJbkNv
+bW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eYIBADCBugYIKwYBBQUHAQEEga0wgaowgacGCCsGAQUFBzAChoGa
+aHR0cDovL2luY29tbW9uY2ExLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdl
+L2NlcnRzL2NhLWNlcnRzLnA3YgoJCUNBIElzc3VlcnMgLSBVUkk6aHR0cDovL2lu
+Y29tbW9uY2EyLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdlL2NlcnRzL2Nh
+LWNlcnRzLnA3YjCBjQYDVR0fBIGFMIGCMD+gPaA7hjlodHRwOi8vaW5jb21tb25j
+cmwxLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvY3JsL2VlY3Jscy5jcmwwP6A9oDuG
+OWh0dHA6Ly9pbmNvbW1vbmNybDIuaW5jb21tb25mZWRlcmF0aW9uLm9yZy9jcmwv
+ZWVjcmxzLmNybDBeBgNVHSAEVzBVMFMGCysGAQQBriMBBAEBMEQwQgYIKwYBBQUH
+AgEWNmh0dHA6Ly9pbmNvbW1vbmNhLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvcHJh
+Y3RpY2VzLnBkZjANBgkqhkiG9w0BAQUFAAOCAQEAZfgKUPA+Ky+Ou/vclMlFTMlU
+GspfbNSdG/fmIq+E/Lv1d2c73Am1zGhOpxgdkM8SE+BPnXW2rl71/N8gaqwgBBxk
+pwn410siumxlDTwV3HoVFvCGWylNy9o8OE1LyTCqfo8PRwrMzhwcagDgD813BIyj
+uJg/JQz1LnHMocIW/JligloSIzF1O435/+ckfWXQsmBIhvV5TmA3ZrcycrI1cHGE
+ZqrCXL0FMZLSr+Vady/tFbVojqI8pSubSMxNkZectePTBjVj1Qeb4hmG8jRv/fwy
+1Iw6OFH8RKny8nQaO5mOe/fF/swEsMVU9TDpvLIgbhTwnP7Nhfotgaxf5wG8WA==
+</security:Certificate>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/key.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/key.pem
new file mode 100644
index 000000000..951462f0d
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/key.pem
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRm
+Skki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX6
+7QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqad
+rHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYi
+dNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+
+zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABAoIBAHG6nLv13zmTdS5a
+UrX4qNPNVgryxs+N4kw51iPqQeFLGVvPB3ZtHSz46+SkhQEJHu37mtqCo3IijRZL
+rIhtIIG8FG3U18sBXNJgiCN9J26ggB2RI3DvyMxww5X6FOcWGjBkEFGtJaE6n//Y
+EbWnO+oxyC+j7DMZVoo2+MBYH8LHPXpMPFPhYbf12LpHY+WeNgX/eemMTlSylBln
+lfhySCtpLcgY7+juYlXaZ9Y1z37QZBcP6yYLTnXJVlhY1KcULh+/PUnmzVpHbkwU
+v/yQiFGFsve1ROp0ztB6sFufLnvGcTa3T1Oeza9ZaX/zjbMbGp3qjSGoknS23U0Q
+ZotRB+ECgYEA9EmvBYLWgEayOlZPcBwKZ3Qrwf9ip3xmtubrf9byIozEeQTKvHmA
+UvK5dKN1pwK0gTaWk5aq+n64HtwJ0+pO4bV32TJJlV/la4xd7wHdH5+S5cdQjd/r
+tuxyejp5FhqT+x2rKibskEeFKhfgIIolpkcNFIKc9xa3/VBOWPxV19kCgYEAz4vl
+xJhD8Cf97bm5hemiJPt2eQMCTGCE39O4UaY6xi5lINoySoh8qd2e59nnneG4YaNp
+tHU23oh00m68Jx8b7wMFliQ/J59lxAkfP262EkBqf/VOAVXQo/iaA8HSwq3Hfwt5
+0F4HMQEfB6qf7/LGvFHTQ8+Wn1upZGaYP1YAghsCgYBe3FILmNAExe8luihkx26+
+15y6W5qKoUMdmTQv0175TaJpwBOd9qx/CWQ8x9DDBsjjODhmnWZNmXGUAiwKz3zM
+JvSgMefjCncDOWGskxOz2PppIenE/gQBZ3XYwuYMUEvQgqfZ2X2ZVTx/qP/Ogva1
+x/drVIDxbjAKPOn/ohUPmQKBgQChW5qfZeIr7Gu3TxW1zxaIuhg5rOU0jDXB7tD2
+ac54Fcn56KoA2GxThEHu77LrRHodLvcXnamzCVQJ5p3RrJYDFM5bFIMlQv/TkWQB
+5QkY14v1P7oNv7IeSUE0epRpVsIrO7jRDsl4h+6f/z+pRY7NCrC9n77y1ki0Di9/
+zlVG0QKBgFXQkO/bf0Qs3COPWUs5nHyQ/sR0ptx1jrFDSjCdGvBC7NrDlwNP3894
+EHCUTrEHhjtAGVzyZakZ6PLAN9cf86N1QhvOdj/oasL5vddWyFK74x2/mtp59VOU
+LaCxnnbG4JoSVX96BSzUFbtRrQbf2+t5ZON9K12IPIxstMkF2j8u
+-----END RSA PRIVATE KEY-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/publicKey.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/publicKey.pem
new file mode 100644
index 000000000..5c4e2e78c
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/publicKey.pem
@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxg0TyQAP/tIvOH89EtaX
+uRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/
+LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88
+NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbh
+nR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3
+E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn1
+4wIDAQAB
+-----END PUBLIC KEY-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceBasic.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceBasic.xml
new file mode 100644
index 000000000..92124520e
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceBasic.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:BasicResourceBacked">
+ <security:PublicKey>%{DIR}/credential/cert.pem</security:PublicKey>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceCertElementsKeyName.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceCertElementsKeyName.xml
new file mode 100644
index 000000000..2e29412e9
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceCertElementsKeyName.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:X509ResourceBacked" entityID="https://sp.example.org/sp/shibboleth" usage="Signing" >
+ <security:KeyName>Name1</security:KeyName>
+ <security:KeyName>Name2</security:KeyName>
+ <security:Certificate>%{DIR}/credential/cert.pem</security:Certificate>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceCertOnly.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceCertOnly.xml
new file mode 100644
index 000000000..7996375d4
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceCertOnly.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:X509ResourceBacked">
+ <security:Certificate>classpath:/org/opensaml/spring/credential/cert.pem</security:Certificate>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceKeyCertCrl.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceKeyCertCrl.xml
new file mode 100644
index 000000000..be79fa870
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceKeyCertCrl.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:X509ResourceBacked">
+ <security:PrivateKey>%{DIR}/credential/key.pem</security:PrivateKey>
+ <security:Certificate>%{DIR}/credential/certificate.pem</security:Certificate>
+ <security:Certificate entityCertificate="true">%{DIR}/credential/cert.pem</security:Certificate>
+ <security:CRL>%{DIR}/credential/crl.pem</security:CRL>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourcePublicOnly.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourcePublicOnly.xml
new file mode 100644
index 000000000..dbdf793fa
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourcePublicOnly.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:BasicResourceBacked">
+ <security:PublicKey>classpath:/org/opensaml/spring/credential/publicKey.pem</security:PublicKey>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourcePublicPrivate.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourcePublicPrivate.xml
new file mode 100644
index 000000000..40c917f27
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourcePublicPrivate.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:BasicResourceBacked">
+ <security:PrivateKey>%{DIR}/credential/key.pem</security:PrivateKey>
+ <security:PublicKey>%{DIR}/credential/publicKey.pem</security:PublicKey>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESBase64.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESBase64.xml
new file mode 100644
index 000000000..693a9e367
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESBase64.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="credential" xsi:type="security:BasicResourceBacked">
+ <security:SecretKey algorithm="AES" encoding="base64">classpath:/org/opensaml/spring/credential/aes-base64.txt</security:SecretKey>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESBinary.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESBinary.xml
new file mode 100644
index 000000000..ea2eed9a8
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESBinary.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="credential" xsi:type="security:BasicResourceBacked">
+ <security:SecretKey algorithm="AES" encoding="binary">classpath:/org/opensaml/spring/credential/aes-binary.data</security:SecretKey>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESHex.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESHex.xml
new file mode 100644
index 000000000..32ca72996
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESHex.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="credential" xsi:type="security:BasicResourceBacked">
+ <security:SecretKey algorithm="AES" encoding="hex">classpath:/org/opensaml/spring/credential/aes-hex.txt</security:SecretKey>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceTwoCert.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceTwoCert.xml
new file mode 100644
index 000000000..5c840bf59
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceTwoCert.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:X509ResourceBacked">
+ <security:Certificate entityCertificate="true">%{DIR}/credential/certificate.pem</security:Certificate>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceWrongCert.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceWrongCert.xml
new file mode 100644
index 000000000..1d90f7fef
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceWrongCert.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:X509ResourceBacked">
+ <security:PrivateKey>%{DIR}/credential/key.pem</security:PrivateKey>
+ <security:Certificate>%{DIR}/credential/certificate.pem</security:Certificate>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceWrongPublic.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceWrongPublic.xml
new file mode 100644
index 000000000..fd37c2e98
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceWrongPublic.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:BasicResourceBacked">
+ <security:PrivateKey>%{DIR}/credential/key.pem</security:PrivateKey>
+ <security:PublicKey>%{DIR}/credential/wrongPublicKey.pem</security:PublicKey>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceX509.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceX509.xml
new file mode 100644
index 000000000..b087dd962
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceX509.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="IdPCredential" xsi:type="security:X509ResourceBacked">
+ <security:Certificate>%{DIR}/credential/cert.pem</security:Certificate>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/secretKeyAESBase64.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/secretKeyAESBase64.xml
new file mode 100644
index 000000000..6eb1ad98f
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/secretKeyAESBase64.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="credential" xsi:type="security:BasicInline">
+ <security:SecretKey algorithm="AES" encoding="base64">
+ 3MvnCRvjjWgqazN4O2cHCw==
+ </security:SecretKey>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/secretKeyAESHex.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/secretKeyAESHex.xml
new file mode 100644
index 000000000..75925e63e
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/secretKeyAESHex.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="credential" xsi:type="security:BasicInline">
+ <security:SecretKey algorithm="AES" encoding="hex">
+ dccbe7091be38d682a6b33783b67070b
+ </security:SecretKey>
+</security:Credential>
+
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/wrongPublicKey.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/wrongPublicKey.pem
new file mode 100644
index 000000000..33164a38a
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/wrongPublicKey.pem
@@ -0,0 +1,6 @@
+-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDnMoe4PkMY8RAf7IsMwgDkzjof
+AmTsfGUZDs31aaSFojbbNc8LRQ7yxjgAlb/yeWbSlznTmJCZuCyWDv8nIF6YGPWw
+juk6np4JQ+zs1HabBq6NcG26uJFokh4BfUaOvew77dou+rFQS7Q9apyLibW5zxcd
+AID4+URBBCcH1QgnBwIDAQAB
+-----END PUBLIC KEY-----
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/cert.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/cert.pem
new file mode 100644
index 000000000..c0df65bc9
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/cert.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+-----END CERTIFICATE-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chain.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chain.xml
new file mode 100644
index 000000000..30154f530
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chain.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine
+ xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+ xsi:type="security:SignatureChaining" id="Chain">
+ <security:TrustEngine id="testBean"
+ xsi:type="security:StaticPKIXSignature" xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+ <security:ValidationInfo id="PKIXInline"
+ xsi:type="security:PKIXInline" />
+ </security:TrustEngine>
+ <security:TrustEngine id="testBean"
+ xsi:type="security:StaticExplicitKeySignature">
+ <security:Credential id="IdPCredential" xsi:type="security:X509Inline">
+ <security:Certificate>
+ MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+ BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+ aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+ MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+ ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+ CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+ x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+ lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+ DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+ J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+ T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+ p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+ 0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+ BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+ MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+ BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+ 0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+ 8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+ 1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+ i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+ </security:Certificate>
+ </security:Credential>
+ </security:TrustEngine>
+</security:TrustEngine>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chainingTrue.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chainingTrue.xml
new file mode 100644
index 000000000..5622efcad
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chainingTrue.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+ default-init-method="initialize" default-destroy-method="destroy">
+
+ <security:TrustEngine id="testBean" xsi:type="security:Chaining">
+ <security:TrustEngineRef ref="OneTrue"/>
+ </security:TrustEngine>
+
+ <bean id="OneTrue" class="org.opensaml.spring.trust.MockTrustEngine" c:retVal="true"/>
+ </beans>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chainingTrueFalse.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chainingTrueFalse.xml
new file mode 100644
index 000000000..7ab5626ed
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chainingTrueFalse.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+ default-init-method="initialize" default-destroy-method="destroy">
+
+ <security:TrustEngine id="testBean" xsi:type="security:Chaining">
+ <security:TrustEngineRef ref="OneFalse"/>
+ <security:TrustEngineRef ref="OneTrue"/>
+ <security:TrustEngineRef ref="Object"/>
+ </security:TrustEngine>
+
+ <bean id="OneFalse" class="org.opensaml.spring.trust.MockTrustEngine" c:retVal="false"/>
+ <bean id="OneTrue" class="org.opensaml.spring.trust.MockTrustEngine" c:retVal="true"/>
+ <bean id="Object" class="java.lang.Object"/>
+ </beans>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/crl.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/crl.pem
new file mode 100644
index 000000000..f8036cef1
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/crl.pem
@@ -0,0 +1,19 @@
+-----BEGIN X509 CRL-----
+MIIDBjCCAe4CAQEwDQYJKoZIhvcNAQEEBQAwVjELMAkGA1UEBhMCVVMxHDAaBgNV
+BAoTE0luQ29tbW9uIEZlZGVyYXRpb24xKTAnBgNVBAMTIEluQ29tbW9uIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5Fw0wNzA4MDMxNDE0NDhaFw0wNzA5MDIxNDE0NDha
+MIHdMBICAQIXDTA0MDMzMTE5NDk0NFowEgIBDhcNMDQwOTE3MTkzMTUxWjASAgEP
+Fw0wNDA5MTcxOTMyMTRaMBICARYXDTA1MDMyMjE3MTYyMFowEgIBHBcNMDUwMjAx
+MTkyOTUxWjASAgE+Fw0wNjA0MDcxNjM1MzFaMBICAUAXDTA2MDQwNzE2MzQ1NFow
+EgIBQRcNMDYwNDEwMTcyMjE1WjASAgFWFw0wNjA3MjAxNzIyMzVaMBICAW8XDTA2
+MTIxOTIwMTQxMVowEwICAIwXDTA3MDMyOTIxMjE0N1qggYMwgYAwfgYDVR0jBHcw
+dYAUky3IYRitY+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYD
+VQQKExNJbkNvbW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eYIBADANBgkqhkiG9w0BAQQFAAOCAQEAeCvRTq70
+RJxkxgbV+crqhN6oh3k974GGXhOxYDTTGjYbhK8JnCXkt1uJcnGfl1xyqrozoSrl
+oxoBUmStA8vVqYwtO/FfGpnCyfOG9H2/rAkzbqwr/EXO+MqSd8e1AIJho97i/QSs
+FWp40h7GeanmiZXL6bc4o9cKb0ROtc1n2nYHkLXptf9bFHte2Z/RhbUr8KaPU4b9
+T9PW9a2Z7Oc4BDHpEUcljZL0AlO6mGI2RtDB9RdrtRY6M9YQbBwUcV9r+/+ylfZY
+ugMRDTNUqL72hHKJgmbnfc0CmkcZKHOIGXdGCIX6ewNsLOQnlFAQEVyojQqbzT8w
+s6E8aj6AzPhKyw==
+-----END X509 CRL-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/inlineValidationInfo.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/inlineValidationInfo.xml
new file mode 100644
index 000000000..263193d70
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/inlineValidationInfo.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:ValidationInfo xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="PKIXInline" xsi:type="security:PKIXInline"/>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/inlineValidationInfoValues.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/inlineValidationInfoValues.xml
new file mode 100644
index 000000000..025db6ed1
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/inlineValidationInfoValues.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:ValidationInfo xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+ id="PKIXInlineValues" xsi:type="security:PKIXInline" verifyDepth="98">
+ <security:Certificate>
+ MIIDSTCCArKgAwIBAgIJAKg8tR5hjVM4MA0GCSqGSIb3DQEBBQUAMHcxCzAJBgNV
+ BAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMK
+ V2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYD
+ VQQDEwtleGFtcGxlLm9yZzAeFw0wNzA4MDUxMzA4MDJaFw0xNzA4MDIxMzA4MDJa
+ MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTET
+ MBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJz
+ aXR5MRQwEgYDVQQDEwtleGFtcGxlLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
+ gYkCgYEA5zKHuD5DGPEQH+yLDMIA5M46HwJk7HxlGQ7N9WmkhaI22zXPC0UO8sY4
+ AJW/8nlm0pc505iQmbgslg7/JyBemBj1sI7pOp6eCUPs7NR2mwaujXBturiRaJIe
+ AX1Gjr3sO+3aLvqxUEu0PWqci4m1uc8XHQCA+PlEQQQnB9UIJwcCAwEAAaOB3DCB
+ 2TAdBgNVHQ4EFgQUzEhylzE4wmr4FK1lZ7zjR/KmA24wgakGA1UdIwSBoTCBnoAU
+ zEhylzE4wmr4FK1lZ7zjR/KmA26he6R5MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQI
+ ExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwG
+ A1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYDVQQDEwtleGFtcGxlLm9y
+ Z4IJAKg8tR5hjVM4MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAGfkM
+ HUeWzHzsBkwTu+S2vX4gzlJPjiL3RzL40og/qyGz38P4KVg8IQvsGDjs1VFzzcAJ
+ I5ULnSocUOTk5sCTjDKT6VILhgAYJ1jnqIo7Z+VC1r3AS9cSDakzqWTc19EFKxEw
+ 6jeBWaqyykdSiVhCAmG5AJsvk+K032zjkWWMo+0=
+ </security:Certificate>
+ <security:Certificate>
+ MIIFmjCCBIKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJVUzEc
+ MBoGA1UEChMTSW5Db21tb24gRmVkZXJhdGlvbjEpMCcGA1UEAxMgSW5Db21tb24g
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwMzMwMjAzNDAwWhcNMTQwMzI5
+ MjAzNDAwWjBWMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTSW5Db21tb24gRmVkZXJh
+ dGlvbjEpMCcGA1UEAxMgSW5Db21tb24gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRGjKsUM2QAupLAaWx82/C
+ WPalKjKFY8UPmz0T3gf7tJPztTy1Zq8pD0WFRLcQeSBKZGCu8upe8X966b6TZ5yu
+ oUDA754If0DWismuHNoMgRR/l0UvZmPWDGRWd3NBTB8/soLA4EbqFf5Xq8MOJKhP
+ tzcDR33gtaAb3oilZ+ZTpnhTFFrn/qXrAKcSDBpuW2JRpi3xaF/hTPI097oUShOz
+ D1Zj21UYLA6iSFVN+1wlfwilf2KFNK/+zbkCge6wgipZyXxaOAam6ncqmkxy+hy/
+ OiJMmdB+6xkO0xXSBUUcqxJrOcUQhA1vntgb3q5zOJISXhC4RAReA0HyBp/wd0iD
+ AgMBAAGjggJxMIICbTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+ BgNVHQ4EFgQUky3IYRitY+ObZbOd3Y2TuufKY0UwfgYDVR0jBHcwdYAUky3IYRit
+ Y+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYDVQQKExNJbkNv
+ bW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0aWZpY2F0aW9u
+ IEF1dGhvcml0eYIBADCBugYIKwYBBQUHAQEEga0wgaowgacGCCsGAQUFBzAChoGa
+ aHR0cDovL2luY29tbW9uY2ExLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdl
+ L2NlcnRzL2NhLWNlcnRzLnA3YgoJCUNBIElzc3VlcnMgLSBVUkk6aHR0cDovL2lu
+ Y29tbW9uY2EyLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdlL2NlcnRzL2Nh
+ LWNlcnRzLnA3YjCBjQYDVR0fBIGFMIGCMD+gPaA7hjlodHRwOi8vaW5jb21tb25j
+ cmwxLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvY3JsL2VlY3Jscy5jcmwwP6A9oDuG
+ OWh0dHA6Ly9pbmNvbW1vbmNybDIuaW5jb21tb25mZWRlcmF0aW9uLm9yZy9jcmwv
+ ZWVjcmxzLmNybDBeBgNVHSAEVzBVMFMGCysGAQQBriMBBAEBMEQwQgYIKwYBBQUH
+ AgEWNmh0dHA6Ly9pbmNvbW1vbmNhLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvcHJh
+ Y3RpY2VzLnBkZjANBgkqhkiG9w0BAQUFAAOCAQEAZfgKUPA+Ky+Ou/vclMlFTMlU
+ GspfbNSdG/fmIq+E/Lv1d2c73Am1zGhOpxgdkM8SE+BPnXW2rl71/N8gaqwgBBxk
+ pwn410siumxlDTwV3HoVFvCGWylNy9o8OE1LyTCqfo8PRwrMzhwcagDgD813BIyj
+ uJg/JQz1LnHMocIW/JligloSIzF1O435/+ckfWXQsmBIhvV5TmA3ZrcycrI1cHGE
+ ZqrCXL0FMZLSr+Vady/tFbVojqI8pSubSMxNkZectePTBjVj1Qeb4hmG8jRv/fwy
+ 1Iw6OFH8RKny8nQaO5mOe/fF/swEsMVU9TDpvLIgbhTwnP7Nhfotgaxf5wG8WA==
+ </security:Certificate>
+ <security:CRL>
+ MIIDBjCCAe4CAQEwDQYJKoZIhvcNAQEEBQAwVjELMAkGA1UEBhMCVVMxHDAaBgNV
+ BAoTE0luQ29tbW9uIEZlZGVyYXRpb24xKTAnBgNVBAMTIEluQ29tbW9uIENlcnRp
+ ZmljYXRpb24gQXV0aG9yaXR5Fw0wNzA4MDMxNDE0NDhaFw0wNzA5MDIxNDE0NDha
+ MIHdMBICAQIXDTA0MDMzMTE5NDk0NFowEgIBDhcNMDQwOTE3MTkzMTUxWjASAgEP
+ Fw0wNDA5MTcxOTMyMTRaMBICARYXDTA1MDMyMjE3MTYyMFowEgIBHBcNMDUwMjAx
+ MTkyOTUxWjASAgE+Fw0wNjA0MDcxNjM1MzFaMBICAUAXDTA2MDQwNzE2MzQ1NFow
+ EgIBQRcNMDYwNDEwMTcyMjE1WjASAgFWFw0wNjA3MjAxNzIyMzVaMBICAW8XDTA2
+ MTIxOTIwMTQxMVowEwICAIwXDTA3MDMyOTIxMjE0N1qggYMwgYAwfgYDVR0jBHcw
+ dYAUky3IYRitY+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYD
+ VQQKExNJbkNvbW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0
+ aWZpY2F0aW9uIEF1dGhvcml0eYIBADANBgkqhkiG9w0BAQQFAAOCAQEAeCvRTq70
+ RJxkxgbV+crqhN6oh3k974GGXhOxYDTTGjYbhK8JnCXkt1uJcnGfl1xyqrozoSrl
+ oxoBUmStA8vVqYwtO/FfGpnCyfOG9H2/rAkzbqwr/EXO+MqSd8e1AIJho97i/QSs
+ FWp40h7GeanmiZXL6bc4o9cKb0ROtc1n2nYHkLXptf9bFHte2Z/RhbUr8KaPU4b9
+ T9PW9a2Z7Oc4BDHpEUcljZL0AlO6mGI2RtDB9RdrtRY6M9YQbBwUcV9r+/+ylfZY
+ ugMRDTNUqL72hHKJgmbnfc0CmkcZKHOIGXdGCIX6ewNsLOQnlFAQEVyojQqbzT8w
+ s6E8aj6AzPhKyw==
+ </security:CRL>
+</security:ValidationInfo>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/resourceValidationInfo.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/resourceValidationInfo.xml
new file mode 100644
index 000000000..3ee7a7dbd
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/resourceValidationInfo.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:ValidationInfo xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ id="validInfoSimple" xsi:type="security:PKIXResourceBacked"/>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/resourceValidationInfoValues.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/resourceValidationInfoValues.xml
new file mode 100644
index 000000000..cd6f56f91
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/resourceValidationInfoValues.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:ValidationInfo xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+ id="validInfoValues" xsi:type="security:PKIXResourceBacked" verifyDepth="99">
+
+ <security:Certificate>%{DIR}/trust/cert.pem</security:Certificate>
+ <security:Certificate>classpath:/org/opensaml/spring/trust/cert.pem</security:Certificate>
+ <security:CRL>%{DIR}/trust/crl.pem</security:CRL>
+</security:ValidationInfo>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml
new file mode 100644
index 000000000..7f0823a8c
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:c="http://www.springframework.org/schema/c"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+
+ default-init-method="initialize"
+ default-destroy-method="destroy">
+
+ <bean id="StaticPKIXX509CredentialTrustEngine"
+ class="org.opensaml.spring.trust.StaticPKIXFactoryBean">
+ <property name="certificates">
+ <list>
+ <value>org/opensaml/spring/credential/idp-signing.crt</value>
+ </list>
+ </property>
+ <property name="trustEvaluator">
+ <bean class="org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator" destroy-method="">
+ <property name="PKIXValidationOptions">
+ <bean class="org.opensaml.security.x509.impl.CertPathPKIXValidationOptions"
+ p:forceRevocationEnabled="true"
+ p:revocationEnabled="true"
+ destroy-method="" />
+ </property>
+ </bean>
+ </property>
+ </bean>
+
+</beans>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-custom-success.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-custom-success.xml
new file mode 100644
index 000000000..22e93f04c
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-custom-success.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:c="http://www.springframework.org/schema/c"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+
+ default-init-method="initialize"
+ default-destroy-method="destroy">
+
+ <bean id="StaticPKIXX509CredentialTrustEngine"
+ class="org.opensaml.spring.trust.StaticPKIXFactoryBean">
+ <property name="certificates">
+ <list>
+ <value>org/opensaml/spring/credential/idp-signing.crt</value>
+ </list>
+ </property>
+ <property name="trustEvaluator">
+ <bean class="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.MockPKIXTrustEvaluator" />
+ </property>
+ <property name="credentialNameEvaluator">
+ <bean class="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.MockX509CredentialNameEvaluator" />
+ </property>
+ </bean>
+
+</beans>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-defaults.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-defaults.xml
new file mode 100644
index 000000000..cf186faec
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-defaults.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:c="http://www.springframework.org/schema/c"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+
+ default-init-method="initialize"
+ default-destroy-method="destroy">
+
+ <bean id="StaticPKIXX509CredentialTrustEngine"
+ class="org.opensaml.spring.trust.StaticPKIXFactoryBean">
+ <property name="certificates">
+ <list>
+ <value>org/opensaml/spring/credential/idp-signing.crt</value>
+ </list>
+ </property>
+ </bean>
+
+</beans>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicit.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicit.xml
new file mode 100644
index 000000000..ec84d9966
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicit.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean"
+ xsi:type="security:StaticExplicitKey" xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+ <security:Credential id="InLineBean" xsi:type="security:X509Inline">
+ <security:Certificate>
+ MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+ BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+ aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+ MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+ ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+ CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+ x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+ lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+ DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+ J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+ T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+ p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+ 0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+ BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+ MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+ BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+ 0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+ 8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+ 1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+ i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+ </security:Certificate>
+ </security:Credential>
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicitNative.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicitNative.xml
new file mode 100644
index 000000000..655606a74
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicitNative.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+ default-init-method="initialize" default-destroy-method="destroy">
+
+ <bean id="staticKeySingle"
+ class="org.opensaml.spring.trust.StaticExplicitKeyFactoryBean"
+ p:publicKeys="classpath:/org/opensaml/spring/credential/publicKey.pem" />
+
+ <bean id="staticX509Single"
+ class="org.opensaml.spring.trust.StaticExplicitKeyFactoryBean"
+ p:certificates="classpath:/org/opensaml/spring/credential/cert.pem" />
+
+ <bean id="staticX509Multiple"
+ class="org.opensaml.spring.trust.StaticExplicitKeyFactoryBean"
+ p:certificates="classpath:/org/opensaml/spring/credential/certificate.pem" />
+
+ <bean id="staticMixed"
+ class="org.opensaml.spring.trust.StaticExplicitKeyFactoryBean"
+ p:publicKeys="classpath:/org/opensaml/spring/credential/publicKey.pem"
+ p:certificates="classpath:/org/opensaml/spring/credential/cert.pem" />
+
+</beans>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicitSignature.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicitSignature.xml
new file mode 100644
index 000000000..2fbaec963
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicitSignature.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean"
+ xsi:type="security:StaticExplicitKeySignature" xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+ <security:Credential id="InLineBean" xsi:type="security:X509Inline">
+ <security:Certificate>
+ MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+ BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+ aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+ MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+ ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+ CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+ x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+ lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+ DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+ J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+ T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+ p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+ 0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+ BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+ MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+ BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+ 0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+ 8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+ 1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+ i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+ </security:Certificate>
+ </security:Credential>
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIX-nameCheckDisabled.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIX-nameCheckDisabled.xml
new file mode 100644
index 000000000..a67e5bdba
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIX-nameCheckDisabled.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean" trustedNameCheckEnabled="false"
+ xsi:type="security:StaticPKIXSignature" xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+ <security:ValidationInfo id="PKIXInline"
+ xsi:type="security:PKIXInline" />
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIX.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIX.xml
new file mode 100644
index 000000000..c32778780
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIX.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean"
+ xsi:type="security:StaticPKIXSignature" xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+ <security:ValidationInfo id="PKIXInline"
+ xsi:type="security:PKIXInline" />
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXCredentials-nameCheckDisabled.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXCredentials-nameCheckDisabled.xml
new file mode 100644
index 000000000..10468c5d4
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXCredentials-nameCheckDisabled.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean" trustedNameCheckEnabled="false"
+ xsi:type="security:StaticPKIXX509Credential" xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+ <security:ValidationInfo id="PKIXFS"
+ xsi:type="security:PKIXResourceBacked" verifyDepth="99" />
+ <security:ValidationOptions xsi:type="security:CertPathValidationOptionsType"
+ processCredentialCRLs="false" processExpiredCRLs="false"
+ processEmptyCRLs="false" defaultVerificationDepth="3"
+ anyPolicyInhibit="true" policyMappingInhibit="true" forceRevocationEnabled="true" revocationEnabled="false"
+ >
+ <security:PolicyOID>1234
+ </security:PolicyOID><security:PolicyOID>
+
+ </security:PolicyOID>
+ </security:ValidationOptions>
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXCredentials.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXCredentials.xml
new file mode 100644
index 000000000..552f3ac82
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXCredentials.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean"
+ xsi:type="security:StaticPKIXX509Credential" xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+ <security:TrustedName>Name1</security:TrustedName>
+ <security:ValidationInfo id="PKIXFS"
+ xsi:type="security:PKIXResourceBacked" verifyDepth="99" />
+ <security:ValidationOptions xsi:type="security:CertPathValidationOptionsType"
+ processCredentialCRLs="false" processExpiredCRLs="false"
+ processEmptyCRLs="false" defaultVerificationDepth="3"
+ anyPolicyInhibit="true" policyMappingInhibit="true" forceRevocationEnabled="true" revocationEnabled="false"
+ >
+ <security:PolicyOID>1234
+ </security:PolicyOID><security:PolicyOID>
+
+ </security:PolicyOID>
+ </security:ValidationOptions>
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXValues.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXValues.xml
new file mode 100644
index 000000000..19dc58de5
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXValues.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean"
+ xsi:type="security:StaticPKIXSignature" xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+ <security:TrustedName>Name1</security:TrustedName>
+ <security:TrustedName>Name2</security:TrustedName>
+ <security:TrustedName>Name3</security:TrustedName>
+ <security:ValidationInfo id="PKIXFS"
+ xsi:type="security:PKIXResourceBacked" verifyDepth="99" />
+ <security:ValidationInfo id="PKIXIL"
+ xsi:type="security:PKIXInline" verifyDepth="98" />
+ <security:ValidationOptions
+ processCredentialCRLs="false" processExpiredCRLs="false"
+ processEmptyCRLs="false" defaultVerificationDepth="2" />
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXValuesCertPathOpts.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXValuesCertPathOpts.xml
new file mode 100644
index 000000000..deacbff09
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXValuesCertPathOpts.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean"
+ xsi:type="security:StaticPKIXSignature" xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+ <security:TrustedName>Name1</security:TrustedName>
+ <security:ValidationInfo id="PKIXFS"
+ xsi:type="security:PKIXResourceBacked" verifyDepth="99" />
+ <security:ValidationOptions xsi:type="security:CertPathValidationOptionsType"
+ processCredentialCRLs="false" processExpiredCRLs="false"
+ processEmptyCRLs="false" defaultVerificationDepth="3"
+ anyPolicyInhibit="true" policyMappingInhibit="true" forceRevocationEnabled="true" revocationEnabled="false"
+ >
+ <security:PolicyOID>1234
+ </security:PolicyOID><security:PolicyOID>
+
+ </security:PolicyOID>
+ </security:ValidationOptions>
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/validationOptions.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/validationOptions.xml
new file mode 100644
index 000000000..eb36a831b
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/validationOptions.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:ValidationOptions
+ xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"/>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/validationOptionsValues.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/validationOptionsValues.xml
new file mode 100644
index 000000000..7ec42ed68
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/validationOptionsValues.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:ValidationOptions
+ xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+ processCredentialCRLs="false" processExpiredCRLs="true" processEmptyCRLs="false" defaultVerificationDepth="2"/>
\ No newline at end of file
diff --git a/opensaml-spring/test-output/Default suite/Default test.html b/opensaml-spring/test-output/Default suite/Default test.html
new file mode 100644
index 000000000..d9e7f5982
--- /dev/null
+++ b/opensaml-spring/test-output/Default suite/Default test.html
@@ -0,0 +1,875 @@
+<html>
+<head>
+<title>TestNG: Default test</title>
+<link href="../testng.css" rel="stylesheet" type="text/css" />
+<link href="../my-testng.css" rel="stylesheet" type="text/css" />
+
+<style type="text/css">
+.log { display: none;}
+.stack-trace { display: none;}
+</style>
+<script type="text/javascript">
+<!--
+function flip(e) {
+ current = e.style.display;
+ if (current == 'block') {
+ e.style.display = 'none';
+ return 0;
+ }
+ else {
+ e.style.display = 'block';
+ return 1;
+ }
+}
+
+function toggleBox(szDivId, elem, msg1, msg2)
+{
+ var res = -1; if (document.getElementById) {
+ res = flip(document.getElementById(szDivId));
+ }
+ else if (document.all) {
+ // this is the way old msie versions work
+ res = flip(document.all[szDivId]);
+ }
+ if(elem) {
+ if(res == 0) elem.innerHTML = msg1; else elem.innerHTML = msg2;
+ }
+
+}
+
+function toggleAllBoxes() {
+ if (document.getElementsByTagName) {
+ d = document.getElementsByTagName('div');
+ for (i = 0; i < d.length; i++) {
+ if (d[i].className == 'log') {
+ flip(d[i]);
+ }
+ }
+ }
+}
+
+// -->
+</script>
+
+</head>
+<body>
+<h2 align='center'>Default test</h2><table border='1' align="center">
+<tr>
+<td>Tests passed/Failed/Skipped:</td><td>43/0/0</td>
+</tr><tr>
+<td>Started on:</td><td>Wed Jun 08 10:36:14 EDT 2022</td>
+</tr>
+<tr><td>Total time:</td><td>2 seconds (2631 ms)</td>
+</tr><tr>
+<td>Included groups:</td><td></td>
+</tr><tr>
+<td>Excluded groups:</td><td></td>
+</tr>
+</table><p/>
+<small><i>(Hover the method name to see the test class name)</i></small><p/>
+<table width='100%' border='1' class='invocation-passed'>
+<tr><td colspan='4' align='center'><b>PASSED TESTS</b></td></tr>
+<tr><td><b>Test method</b></td>
+<td width="30%"><b>Exception</b></td>
+<td width="10%"><b>Time (seconds)</b></td>
+<td><b>Instance</b></td>
+</tr>
+<tr>
+<td title='org.opensaml.spring.trust.PKIXValidationOptionsParserTest.complex()'><b>complex</b><br>Test class: org.opensaml.spring.trust.PKIXValidationOptionsParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.PKIXInlineParserTest.complex()'><b>complex</b><br>Test class: org.opensaml.spring.trust.PKIXInlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXSignatureParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.StaticPKIXSignatureParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.mixed()'><b>mixed</b><br>Test class: org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509FilesystemParserTest.twoCert()'><b>twoCert</b><br>Test class: org.opensaml.spring.credential.X509FilesystemParserTest</td>
+<td><div><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+ at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+ at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+ at org.opensaml.spring.credential.X509FilesystemParserTest.twoCert(X509FilesystemParserTest.java:53)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+ at org.opensaml.spring.credential.BasicX509CredentialFactoryBean.getEntityCertificate(BasicX509CredentialFactoryBean.java:161)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:55)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 44 more
+</pre></div><a href='#' onClick='toggleBox("stack-trace1074844820", this, "Click to show all stack frames", "Click to hide stack frames")'>Click to show all stack frames</a>
+<div class='stack-trace' id='stack-trace1074844820'><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+ at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+ at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+ at org.opensaml.spring.credential.X509FilesystemParserTest.twoCert(X509FilesystemParserTest.java:53)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+ at org.opensaml.spring.credential.BasicX509CredentialFactoryBean.getEntityCertificate(BasicX509CredentialFactoryBean.java:161)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:55)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 44 more
+</pre></div></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.PKIXFilesystemParserTest.complex()'><b>complex</b><br>Test class: org.opensaml.spring.trust.PKIXFilesystemParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicInlineParserTest.publicPrivate()'><b>publicPrivate</b><br>Test class: org.opensaml.spring.credential.BasicInlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXSignatureParserTest.values()'><b>values</b><br>Test class: org.opensaml.spring.trust.StaticPKIXSignatureParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.ChainingTrustEngineTest.one()'><b>one</b><br>Test class: org.opensaml.spring.trust.ChainingTrustEngineTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicResourceParserTest.wrongCert()'><b>wrongCert</b><br>Test class: org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td><div><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+ at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+ at org.opensaml.spring.credential.BasicResourceParserTest.wrongCert(BasicResourceParserTest.java:46)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+ at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+ at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:125)
+ at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+ at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+ at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+ at java.base/java.security.Signature.verify(Signature.java:789)
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+ ... 50 more
+</pre></div><a href='#' onClick='toggleBox("stack-trace1967617997", this, "Click to show all stack frames", "Click to hide stack frames")'>Click to show all stack frames</a>
+<div class='stack-trace' id='stack-trace1967617997'><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+ at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+ at org.opensaml.spring.credential.BasicResourceParserTest.wrongCert(BasicResourceParserTest.java:46)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+ at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+ at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:125)
+ at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+ at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+ at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+ at java.base/java.security.Signature.verify(Signature.java:789)
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+ ... 50 more
+</pre></div></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.singleKey()'><b>singleKey</b><br>Test class: org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509InlineParserTest.certKeyCrl()'><b>certKeyCrl</b><br>Test class: org.opensaml.spring.credential.X509InlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticExplicitKeyParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.StaticExplicitKeyParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicResourceParserTest.secretHex()'><b>secretHex</b><br>Test class: org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.customPropertiesFailsValidation()'><b>customPropertiesFailsValidation</b><br>Test class: org.opensaml.spring.trust.StaticPKIXFactoryBeanTest</td>
+<td><div><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StaticPKIXX509CredentialTrustEngine' defined in class path resource [org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml]: Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:922)
+ at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:926)
+ at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:592)
+ at org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.customPropertiesFailsValidation(StaticPKIXFactoryBeanTest.java:101)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled
+ at org.opensaml.spring.trust.StaticPKIXFactoryBean.validateConfiguration(StaticPKIXFactoryBean.java:271)
+ at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:244)
+ at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 38 more
+</pre></div><a href='#' onClick='toggleBox("stack-trace1366212088", this, "Click to show all stack frames", "Click to hide stack frames")'>Click to show all stack frames</a>
+<div class='stack-trace' id='stack-trace1366212088'><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StaticPKIXX509CredentialTrustEngine' defined in class path resource [org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml]: Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both [...]
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:922)
+ at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:926)
+ at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:592)
+ at org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.customPropertiesFailsValidation(StaticPKIXFactoryBeanTest.java:101)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled
+ at org.opensaml.spring.trust.StaticPKIXFactoryBean.validateConfiguration(StaticPKIXFactoryBean.java:271)
+ at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:244)
+ at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 38 more
+</pre></div></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicResourceParserTest.secretBinary()'><b>secretBinary</b><br>Test class: org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest.certPath()'><b>certPath</b><br>Test class: org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest.nameCheckDisabled()'><b>nameCheckDisabled</b><br>Test class: org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509FilesystemParserTest.certKeyCrl()'><b>certKeyCrl</b><br>Test class: org.opensaml.spring.credential.X509FilesystemParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXSignatureParserTest.certPath()'><b>certPath</b><br>Test class: org.opensaml.spring.trust.StaticPKIXSignatureParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest.bean()'><b>bean</b><br>Test class: org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest at 29e495ff</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.PKIXValidationOptionsParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.PKIXValidationOptionsParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXSignatureParserTest.nameCheckDisabled()'><b>nameCheckDisabled</b><br>Test class: org.opensaml.spring.trust.StaticPKIXSignatureParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.multipleCert()'><b>multipleCert</b><br>Test class: org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicInlineParserTest.secretHex()'><b>secretHex</b><br>Test class: org.opensaml.spring.credential.BasicInlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509FilesystemParserTest.certOnly()'><b>certOnly</b><br>Test class: org.opensaml.spring.credential.X509FilesystemParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.PKIXInlineParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.PKIXInlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicResourceParserTest.publicOnly()'><b>publicOnly</b><br>Test class: org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.ChainingTrustEngineTest.two()'><b>two</b><br>Test class: org.opensaml.spring.trust.ChainingTrustEngineTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicResourceParserTest.secretBase64()'><b>secretBase64</b><br>Test class: org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicResourceParserTest.publicPrivate()'><b>publicPrivate</b><br>Test class: org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509FilesystemParserTest.wrongCert()'><b>wrongCert</b><br>Test class: org.opensaml.spring.credential.X509FilesystemParserTest</td>
+<td><div><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+ at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+ at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+ at org.opensaml.spring.credential.X509FilesystemParserTest.wrongCert(X509FilesystemParserTest.java:57)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+ at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 44 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+ at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+ at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+ at java.base/java.security.Signature.verify(Signature.java:789)
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+ ... 51 more
+</pre></div><a href='#' onClick='toggleBox("stack-trace1671811074", this, "Click to show all stack frames", "Click to hide stack frames")'>Click to show all stack frames</a>
+<div class='stack-trace' id='stack-trace1671811074'><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+ at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+ at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+ at org.opensaml.spring.credential.X509FilesystemParserTest.wrongCert(X509FilesystemParserTest.java:57)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+ at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 44 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+ at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+ at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+ at java.base/java.security.Signature.verify(Signature.java:789)
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+ ... 51 more
+</pre></div></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509InlineParserTest.wrongCert()'><b>wrongCert</b><br>Test class: org.opensaml.spring.credential.X509InlineParserTest</td>
+<td><div><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+ at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+ at org.opensaml.spring.credential.X509InlineParserTest.wrongCert(X509InlineParserTest.java:48)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+ at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+ at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+ at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+ at java.base/java.security.Signature.verify(Signature.java:789)
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+ ... 50 more
+</pre></div><a href='#' onClick='toggleBox("stack-trace1264701638", this, "Click to show all stack frames", "Click to hide stack frames")'>Click to show all stack frames</a>
+<div class='stack-trace' id='stack-trace1264701638'><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+ at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+ at org.opensaml.spring.credential.X509InlineParserTest.wrongCert(X509InlineParserTest.java:48)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+ at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+ at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+ at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+ at java.base/java.security.Signature.verify(Signature.java:789)
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+ ... 50 more
+</pre></div></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicInlineParserTest.publicOnly()'><b>publicOnly</b><br>Test class: org.opensaml.spring.credential.BasicInlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509FilesystemParserTest.certElementsKeyNames()'><b>certElementsKeyNames</b><br>Test class: org.opensaml.spring.credential.X509FilesystemParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.SignatureChainingParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.SignatureChainingParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicInlineParserTest.secretBase64()'><b>secretBase64</b><br>Test class: org.opensaml.spring.credential.BasicInlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.defaults()'><b>defaults</b><br>Test class: org.opensaml.spring.trust.StaticPKIXFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509InlineParserTest.certOnly()'><b>certOnly</b><br>Test class: org.opensaml.spring.credential.X509InlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.PKIXFilesystemParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.PKIXFilesystemParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.singleCert()'><b>singleCert</b><br>Test class: org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.customPropertiesSuccess()'><b>customPropertiesSuccess</b><br>Test class: org.opensaml.spring.trust.StaticPKIXFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c</td></tr>
+</table><p>
+</body>
+</html>
\ No newline at end of file
diff --git a/opensaml-spring/test-output/Default suite/Default test.xml b/opensaml-spring/test-output/Default suite/Default test.xml
new file mode 100644
index 000000000..b1ec180e6
--- /dev/null
+++ b/opensaml-spring/test-output/Default suite/Default test.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitXMLReporter -->
+<testsuite ignored="14" hostname="Silver-Machine.local" failures="0" tests="43" name="Default test" time="2.631" errors="0" timestamp="2022-06-08T10:36:17 EDT">
+ <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="publicOnly" time="0.639"/>
+ <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="publicPrivate" time="0.113"/>
+ <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="secretBase64" time="0.048"/>
+ <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="secretBinary" time="0.057"/>
+ <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="secretHex" time="0.028"/>
+ <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="wrongCert" time="0.068"/>
+ <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="mixed" time="0.124"/>
+ <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="multipleCert" time="0.051"/>
+ <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="singleCert" time="0.062"/>
+ <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="singleKey" time="0.055"/>
+ <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyParserTest" name="simple" time="0.065"/>
+ <testcase classname="org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest" name="simple" time="0.044"/>
+ <testcase classname="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" name="complex" time="0.029"/>
+ <testcase classname="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" name="simple" time="0.019"/>
+ <testcase classname="org.opensaml.spring.trust.PKIXFilesystemParserTest" name="complex" time="0.048"/>
+ <testcase classname="org.opensaml.spring.trust.PKIXFilesystemParserTest" name="simple" time="0.022"/>
+ <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="certElementsKeyNames" time="0.028"/>
+ <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="certKeyCrl" time="0.045"/>
+ <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="certOnly" time="0.013"/>
+ <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="twoCert" time="0.063"/>
+ <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="wrongCert" time="0.066"/>
+ <testcase classname="org.opensaml.spring.credential.X509InlineParserTest" name="certKeyCrl" time="0.049"/>
+ <testcase classname="org.opensaml.spring.credential.X509InlineParserTest" name="certOnly" time="0.027"/>
+ <testcase classname="org.opensaml.spring.credential.X509InlineParserTest" name="wrongCert" time="0.031"/>
+ <testcase classname="org.opensaml.spring.trust.ChainingTrustEngineTest" name="one" time="0.059"/>
+ <testcase classname="org.opensaml.spring.trust.ChainingTrustEngineTest" name="two" time="0.038"/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" name="certPath" time="0.067"/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" name="nameCheckDisabled" time="0.036"/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" name="customPropertiesFailsValidation" time="0.051"/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" name="customPropertiesSuccess" time="0.025"/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" name="defaults" time="0.015"/>
+ <testcase classname="org.opensaml.spring.trust.SignatureChainingParserTest" name="simple" time="0.036"/>
+ <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="publicOnly" time="0.021"/>
+ <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="publicPrivate" time="0.035"/>
+ <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="secretBase64" time="0.017"/>
+ <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="secretHex" time="0.015"/>
+ <testcase classname="org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest" name="bean" time="0.073"/>
+ <testcase classname="org.opensaml.spring.trust.PKIXInlineParserTest" name="complex" time="0.021"/>
+ <testcase classname="org.opensaml.spring.trust.PKIXInlineParserTest" name="simple" time="0.021"/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="certPath" time="0.02"/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="nameCheckDisabled" time="0.022"/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="simple" time="0.02"/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="values" time="0.044"/>
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+ <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+ <ignored/>
+ </testcase> <!-- @BeforeSuite setupDirs -->
+</testsuite> <!-- Default test -->
diff --git a/opensaml-spring/test-output/Default suite/testng-failed.xml b/opensaml-spring/test-output/Default suite/testng-failed.xml
new file mode 100644
index 000000000..071c33d5e
--- /dev/null
+++ b/opensaml-spring/test-output/Default suite/testng-failed.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
+<suite name="Failed suite [Default suite]" guice-stage="DEVELOPMENT">
+ <test thread-count="5" name="Default test(failed)">
+ <classes>
+ <class name="org.opensaml.spring.trust.PKIXFilesystemParserTest">
+ <methods>
+ <include name="setupDirs"/>
+ <include name="tearDownTestContext"/>
+ <include name="complex"/>
+ </methods>
+ </class> <!-- org.opensaml.spring.trust.PKIXFilesystemParserTest -->
+ </classes>
+ </test> <!-- Default test(failed) -->
+</suite> <!-- Failed suite [Default suite] -->
diff --git a/opensaml-spring/test-output/bullet_point.png b/opensaml-spring/test-output/bullet_point.png
new file mode 100644
index 000000000..176e6d5b3
Binary files /dev/null and b/opensaml-spring/test-output/bullet_point.png differ
diff --git a/opensaml-spring/test-output/collapseall.gif b/opensaml-spring/test-output/collapseall.gif
new file mode 100644
index 000000000..a2d80a904
Binary files /dev/null and b/opensaml-spring/test-output/collapseall.gif differ
diff --git a/opensaml-spring/test-output/emailable-report.html b/opensaml-spring/test-output/emailable-report.html
new file mode 100644
index 000000000..c2ab84eb2
--- /dev/null
+++ b/opensaml-spring/test-output/emailable-report.html
@@ -0,0 +1,348 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "https://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="https://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
+<title>TestNG Report</title>
+<style type="text/css">table {margin-bottom:10px;border-collapse:collapse;empty-cells:show}th,td {border:1px solid #009;padding:.25em .5em}th {vertical-align:bottom}td {vertical-align:top}table a {font-weight:bold}.stripe td {background-color: #E6EBF9}.num {text-align:right}.passedodd td {background-color: #3F3}.passedeven td {background-color: #0A0}.skippedodd td {background-color: #DDD}.skippedeven td {background-color: #CCC}.failedodd td,.attn {background-color: #F33}.failedeven td,.s [...]
+</head>
+<body>
+<table>
+<tr><th>Test</th><th># Passed</th><th># Skipped</th><th># Retried</th><th># Failed</th><th>Time (ms)</th><th>Included Groups</th><th>Excluded Groups</th></tr>
+<tr><th colspan="8">Default suite</th></tr>
+<tr><td><a href="#t0">Default test</a></td><td class="num">43</td><td class="num">0</td><td class="num">0</td><td class="num">0</td><td class="num">2,631</td><td></td><td></td></tr>
+</table>
+<table id='summary'><thead><tr><th>Class</th><th>Method</th><th>Start</th><th>Time (ms)</th></tr></thead><tbody><tr><th colspan="4">Default suite</th></tr></tbody><tbody id="t0"><tr><th colspan="4">Default test — passed</th></tr><tr class="passedeven"><td rowspan="4">org.opensaml.spring.credential.BasicInlineParserTest</td><td><a href="#m0">publicOnly</a></td><td rowspan="1">1654698976731</td><td rowspan="1">21</td></tr><tr class="passedeven"><td><a href="#m1">publicPrivate</a></td [...]
+</table>
+<h2>Default test</h2><h3 id="m0">org.opensaml.spring.credential.BasicInlineParserTest#publicOnly</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m1">org.opensaml.spring.credential.BasicInlineParserTest#publicPrivate</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m2">org.opensaml.spring.credential.BasicInlineParserTest#secretBase64</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m3">org.opensaml.spring.credential.BasicInlineParserTest#secretHex</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m4">org.opensaml.spring.credential.BasicResourceParserTest#publicOnly</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m5">org.opensaml.spring.credential.BasicResourceParserTest#publicPrivate</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m6">org.opensaml.spring.credential.BasicResourceParserTest#secretBase64</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m7">org.opensaml.spring.credential.BasicResourceParserTest#secretBinary</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m8">org.opensaml.spring.credential.BasicResourceParserTest#secretHex</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m9">org.opensaml.spring.credential.BasicResourceParserTest#wrongCert</h3><table class="result"><tr><th>Expected Exception</th></tr><tr><td><div class="stacktrace">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+ at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+ at org.opensaml.spring.credential.BasicResourceParserTest.wrongCert(BasicResourceParserTest.java:46)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+ at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+ at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:125)
+ at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+ at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+ at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+ at java.base/java.security.Signature.verify(Signature.java:789)
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+ ... 50 more
+</div></td></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m10">org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest#bean</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m11">org.opensaml.spring.credential.X509FilesystemParserTest#certElementsKeyNames</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m12">org.opensaml.spring.credential.X509FilesystemParserTest#certKeyCrl</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m13">org.opensaml.spring.credential.X509FilesystemParserTest#certOnly</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m14">org.opensaml.spring.credential.X509FilesystemParserTest#twoCert</h3><table class="result"><tr><th>Expected Exception</th></tr><tr><td><div class="stacktrace">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+ at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+ at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+ at org.opensaml.spring.credential.X509FilesystemParserTest.twoCert(X509FilesystemParserTest.java:53)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+ at org.opensaml.spring.credential.BasicX509CredentialFactoryBean.getEntityCertificate(BasicX509CredentialFactoryBean.java:161)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:55)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 44 more
+</div></td></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m15">org.opensaml.spring.credential.X509FilesystemParserTest#wrongCert</h3><table class="result"><tr><th>Expected Exception</th></tr><tr><td><div class="stacktrace">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+ at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+ at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+ at org.opensaml.spring.credential.X509FilesystemParserTest.wrongCert(X509FilesystemParserTest.java:57)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+ at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 44 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+ at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+ at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+ at java.base/java.security.Signature.verify(Signature.java:789)
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+ ... 51 more
+</div></td></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m16">org.opensaml.spring.credential.X509InlineParserTest#certKeyCrl</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m17">org.opensaml.spring.credential.X509InlineParserTest#certOnly</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m18">org.opensaml.spring.credential.X509InlineParserTest#wrongCert</h3><table class="result"><tr><th>Expected Exception</th></tr><tr><td><div class="stacktrace">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+ at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+ at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+ at org.opensaml.spring.credential.X509InlineParserTest.wrongCert(X509InlineParserTest.java:48)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+ at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+ at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+ at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+ at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+ at java.base/java.security.Signature.verify(Signature.java:789)
+ at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+ ... 50 more
+</div></td></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m19">org.opensaml.spring.trust.ChainingTrustEngineTest#one</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m20">org.opensaml.spring.trust.ChainingTrustEngineTest#two</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m21">org.opensaml.spring.trust.PKIXFilesystemParserTest#complex</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m22">org.opensaml.spring.trust.PKIXFilesystemParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m23">org.opensaml.spring.trust.PKIXInlineParserTest#complex</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m24">org.opensaml.spring.trust.PKIXInlineParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m25">org.opensaml.spring.trust.PKIXValidationOptionsParserTest#complex</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m26">org.opensaml.spring.trust.PKIXValidationOptionsParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m27">org.opensaml.spring.trust.SignatureChainingParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m28">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest#mixed</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m29">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest#multipleCert</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m30">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest#singleCert</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m31">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest#singleKey</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m32">org.opensaml.spring.trust.StaticExplicitKeyParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m33">org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m34">org.opensaml.spring.trust.StaticPKIXFactoryBeanTest#customPropertiesFailsValidation</h3><table class="result"><tr><th>Expected Exception</th></tr><tr><td><div class="stacktrace">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StaticPKIXX509CredentialTrustEngine' defined in class path resource [org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml]: Invocation of init method failed; nested exception is org.s [...]
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:922)
+ at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:926)
+ at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:592)
+ at org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.customPropertiesFailsValidation(StaticPKIXFactoryBeanTest.java:101)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+ at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+ at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+ at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+ at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+ at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+ at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+ at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+ at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+ at org.testng.TestRunner.privateRun(TestRunner.java:808)
+ at org.testng.TestRunner.run(TestRunner.java:603)
+ at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+ at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+ at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+ at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+ at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+ at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+ at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+ at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+ at org.testng.TestNG.runSuites(TestNG.java:1092)
+ at org.testng.TestNG.run(TestNG.java:1060)
+ at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+ at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+ at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled
+ at org.opensaml.spring.trust.StaticPKIXFactoryBean.validateConfiguration(StaticPKIXFactoryBean.java:271)
+ at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:244)
+ at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:1)
+ at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+ at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+ ... 38 more
+</div></td></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m35">org.opensaml.spring.trust.StaticPKIXFactoryBeanTest#customPropertiesSuccess</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m36">org.opensaml.spring.trust.StaticPKIXFactoryBeanTest#defaults</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m37">org.opensaml.spring.trust.StaticPKIXSignatureParserTest#certPath</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m38">org.opensaml.spring.trust.StaticPKIXSignatureParserTest#nameCheckDisabled</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m39">org.opensaml.spring.trust.StaticPKIXSignatureParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m40">org.opensaml.spring.trust.StaticPKIXSignatureParserTest#values</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m41">org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest#certPath</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m42">org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest#nameCheckDisabled</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+</body>
+</html>
diff --git a/opensaml-spring/test-output/failed.png b/opensaml-spring/test-output/failed.png
new file mode 100644
index 000000000..c117be59a
Binary files /dev/null and b/opensaml-spring/test-output/failed.png differ
diff --git a/opensaml-spring/test-output/index.html b/opensaml-spring/test-output/index.html
new file mode 100644
index 000000000..baf493101
--- /dev/null
+++ b/opensaml-spring/test-output/index.html
@@ -0,0 +1,1515 @@
+<!DOCTYPE html>
+
+<html>
+ <head>
+ <meta charset='utf-8'>
+ <title>TestNG reports</title>
+
+ <link type="text/css" href="testng-reports1.css" rel="stylesheet" id="ultra" />
+ <link type="text/css" href="testng-reports.css" rel="stylesheet" id="retro" disabled="false"/>
+ <script type="text/javascript" src="jquery.min.js"></script>
+ <script type="text/javascript" src="testng-reports.js"></script>
+ <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+ <script type='text/javascript'>
+ google.load('visualization', '1', {packages:['table']});
+ google.setOnLoadCallback(drawTable);
+ var suiteTableInitFunctions = new Array();
+ var suiteTableData = new Array();
+ </script>
+ <!--
+ <script type="text/javascript" src="jquery-ui/js/jquery-ui-1.8.16.custom.min.js"></script>
+ -->
+ </head>
+
+ <body>
+ <div class="top-banner-root">
+ <span class="top-banner-title-font">Test results</span>
+ <button id="button" class="button">Switch Retro Theme</button> <!-- button -->
+ <br/>
+ <span class="top-banner-font-1">1 suite</span>
+ </div> <!-- top-banner-root -->
+ <div class="navigator-root">
+ <div class="navigator-suite-header">
+ <span>All suites</span>
+ <a href="#" title="Collapse/expand all the suites" class="collapse-all-link">
+ <img src="collapseall.gif" class="collapse-all-icon">
+ </img> <!-- collapse-all-icon -->
+ </a> <!-- collapse-all-link -->
+ </div> <!-- navigator-suite-header -->
+ <div class="suite">
+ <div class="rounded-window">
+ <div class="suite-header light-rounded-window-top">
+ <a href="#" panel-name="suite-Default_suite" class="navigator-link">
+ <span class="suite-name border-passed">Default suite</span>
+ </a> <!-- navigator-link -->
+ </div> <!-- suite-header light-rounded-window-top -->
+ <div class="navigator-suite-content">
+ <div class="suite-section-title">
+ <span>Info</span>
+ </div> <!-- suite-section-title -->
+ <div class="suite-section-content">
+ <ul>
+ <li>
+ <a href="#" panel-name="test-xml-Default_suite" class="navigator-link ">
+ <span>testng-customsuite.xml</span>
+ </a> <!-- navigator-link -->
+ </li>
+ <li>
+ <a href="#" panel-name="testlist-Default_suite" class="navigator-link ">
+ <span class="test-stats">1 test</span>
+ </a> <!-- navigator-link -->
+ </li>
+ <li>
+ <a href="#" panel-name="group-Default_suite" class="navigator-link ">
+ <span>0 groups</span>
+ </a> <!-- navigator-link -->
+ </li>
+ <li>
+ <a href="#" panel-name="times-Default_suite" class="navigator-link ">
+ <span>Times</span>
+ </a> <!-- navigator-link -->
+ </li>
+ <li>
+ <a href="#" panel-name="reporter-Default_suite" class="navigator-link ">
+ <span>Reporter output</span>
+ </a> <!-- navigator-link -->
+ </li>
+ <li>
+ <a href="#" panel-name="ignored-methods-Default_suite" class="navigator-link ">
+ <span>Ignored methods</span>
+ </a> <!-- navigator-link -->
+ </li>
+ <li>
+ <a href="#" panel-name="chronological-Default_suite" class="navigator-link ">
+ <span>Chronological view</span>
+ </a> <!-- navigator-link -->
+ </li>
+ </ul>
+ </div> <!-- suite-section-content -->
+ <div class="result-section">
+ <div class="suite-section-title">
+ <span>Results</span>
+ </div> <!-- suite-section-title -->
+ <div class="suite-section-content">
+ <ul>
+ <li>
+ <span class="method-stats">43 methods, 43 passed</span>
+ </li>
+ <li>
+ <span class="method-list-title passed">Passed methods</span>
+ <span class="show-or-hide-methods passed">
+ <a href="#" panel-name="suite-Default_suite" class="hide-methods passed suite-Default_suite"> (hide)</a> <!-- hide-methods passed suite-Default_suite -->
+ <a href="#" panel-name="suite-Default_suite" class="show-methods passed suite-Default_suite"> (show)</a> <!-- show-methods passed suite-Default_suite -->
+ </span>
+ <div class="method-list-content passed suite-Default_suite">
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest" class="method navigator-link" hash-for-method="bean">bean</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509FilesystemParserTest" class="method navigator-link" hash-for-method="certElementsKeyNames">certElementsKeyNames</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509InlineParserTest" class="method navigator-link" hash-for-method="certKeyCrl">certKeyCrl</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509FilesystemParserTest" class="method navigator-link" hash-for-method="certKeyCrl">certKeyCrl</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509FilesystemParserTest" class="method navigator-link" hash-for-method="certOnly">certOnly</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509InlineParserTest" class="method navigator-link" hash-for-method="certOnly">certOnly</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" class="method navigator-link" hash-for-method="certPath">certPath</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" class="method navigator-link" hash-for-method="certPath">certPath</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" class="method navigator-link" hash-for-method="complex">complex</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.PKIXInlineParserTest" class="method navigator-link" hash-for-method="complex">complex</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.PKIXFilesystemParserTest" class="method navigator-link" hash-for-method="complex">complex</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" class="method navigator-link" hash-for-method="customPropertiesFailsValidation">customPropertiesFailsValidation</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" class="method navigator-link" hash-for-method="customPropertiesSuccess">customPropertiesSuccess</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" class="method navigator-link" hash-for-method="defaults">defaults</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" class="method navigator-link" hash-for-method="mixed">mixed</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" class="method navigator-link" hash-for-method="multipleCert">multipleCert</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" class="method navigator-link" hash-for-method="nameCheckDisabled">nameCheckDisabled</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" class="method navigator-link" hash-for-method="nameCheckDisabled">nameCheckDisabled</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.ChainingTrustEngineTest" class="method navigator-link" hash-for-method="one">one</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicResourceParserTest" class="method navigator-link" hash-for-method="publicOnly">publicOnly</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicInlineParserTest" class="method navigator-link" hash-for-method="publicOnly">publicOnly</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicInlineParserTest" class="method navigator-link" hash-for-method="publicPrivate">publicPrivate</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicResourceParserTest" class="method navigator-link" hash-for-method="publicPrivate">publicPrivate</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicResourceParserTest" class="method navigator-link" hash-for-method="secretBase64">secretBase64</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicInlineParserTest" class="method navigator-link" hash-for-method="secretBase64">secretBase64</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicResourceParserTest" class="method navigator-link" hash-for-method="secretBinary">secretBinary</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicResourceParserTest" class="method navigator-link" hash-for-method="secretHex">secretHex</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicInlineParserTest" class="method navigator-link" hash-for-method="secretHex">secretHex</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticExplicitKeyParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.PKIXInlineParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.SignatureChainingParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.PKIXFilesystemParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" class="method navigator-link" hash-for-method="singleCert">singleCert</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" class="method navigator-link" hash-for-method="singleKey">singleKey</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.ChainingTrustEngineTest" class="method navigator-link" hash-for-method="two">two</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509FilesystemParserTest" class="method navigator-link" hash-for-method="twoCert">twoCert</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" class="method navigator-link" hash-for-method="values">values</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicResourceParserTest" class="method navigator-link" hash-for-method="wrongCert">wrongCert</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509FilesystemParserTest" class="method navigator-link" hash-for-method="wrongCert">wrongCert</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ <span>
+ <img src="passed.png" width="3%"/>
+ <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509InlineParserTest" class="method navigator-link" hash-for-method="wrongCert">wrongCert</a> <!-- method navigator-link -->
+ </span>
+ <br/>
+ </div> <!-- method-list-content passed suite-Default_suite -->
+ </li>
+ </ul>
+ </div> <!-- suite-section-content -->
+ </div> <!-- result-section -->
+ </div> <!-- navigator-suite-content -->
+ </div> <!-- rounded-window -->
+ </div> <!-- suite -->
+ </div> <!-- navigator-root -->
+ <div class="wrapper">
+ <div class="main-panel-root">
+ <div panel-name="suite-Default_suite" class="panel Default_suite">
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="simple">
+ </a> <!-- simple -->
+ <span class="method-name">simple</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.trust.StaticPKIXFactoryBeanTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="customPropertiesFailsValidation">
+ </a> <!-- customPropertiesFailsValidation -->
+ <span class="method-name">customPropertiesFailsValidation</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="customPropertiesSuccess">
+ </a> <!-- customPropertiesSuccess -->
+ <span class="method-name">customPropertiesSuccess</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="defaults">
+ </a> <!-- defaults -->
+ <span class="method-name">defaults</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.trust.ChainingTrustEngineTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="one">
+ </a> <!-- one -->
+ <span class="method-name">one</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="two">
+ </a> <!-- two -->
+ <span class="method-name">two</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.trust.PKIXValidationOptionsParserTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="complex">
+ </a> <!-- complex -->
+ <span class="method-name">complex</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="simple">
+ </a> <!-- simple -->
+ <span class="method-name">simple</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="certPath">
+ </a> <!-- certPath -->
+ <span class="method-name">certPath</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="nameCheckDisabled">
+ </a> <!-- nameCheckDisabled -->
+ <span class="method-name">nameCheckDisabled</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.credential.BasicResourceParserTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="publicOnly">
+ </a> <!-- publicOnly -->
+ <span class="method-name">publicOnly</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="publicPrivate">
+ </a> <!-- publicPrivate -->
+ <span class="method-name">publicPrivate</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="secretBase64">
+ </a> <!-- secretBase64 -->
+ <span class="method-name">secretBase64</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="secretBinary">
+ </a> <!-- secretBinary -->
+ <span class="method-name">secretBinary</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="secretHex">
+ </a> <!-- secretHex -->
+ <span class="method-name">secretHex</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="wrongCert">
+ </a> <!-- wrongCert -->
+ <span class="method-name">wrongCert</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.credential.X509InlineParserTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="certKeyCrl">
+ </a> <!-- certKeyCrl -->
+ <span class="method-name">certKeyCrl</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="certOnly">
+ </a> <!-- certOnly -->
+ <span class="method-name">certOnly</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="wrongCert">
+ </a> <!-- wrongCert -->
+ <span class="method-name">wrongCert</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="mixed">
+ </a> <!-- mixed -->
+ <span class="method-name">mixed</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="multipleCert">
+ </a> <!-- multipleCert -->
+ <span class="method-name">multipleCert</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="singleCert">
+ </a> <!-- singleCert -->
+ <span class="method-name">singleCert</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="singleKey">
+ </a> <!-- singleKey -->
+ <span class="method-name">singleKey</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.trust.PKIXInlineParserTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="complex">
+ </a> <!-- complex -->
+ <span class="method-name">complex</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="simple">
+ </a> <!-- simple -->
+ <span class="method-name">simple</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.trust.PKIXFilesystemParserTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="complex">
+ </a> <!-- complex -->
+ <span class="method-name">complex</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="simple">
+ </a> <!-- simple -->
+ <span class="method-name">simple</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.trust.StaticExplicitKeyParserTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="simple">
+ </a> <!-- simple -->
+ <span class="method-name">simple</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.credential.BasicInlineParserTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="publicOnly">
+ </a> <!-- publicOnly -->
+ <span class="method-name">publicOnly</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="publicPrivate">
+ </a> <!-- publicPrivate -->
+ <span class="method-name">publicPrivate</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="secretBase64">
+ </a> <!-- secretBase64 -->
+ <span class="method-name">secretBase64</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="secretHex">
+ </a> <!-- secretHex -->
+ <span class="method-name">secretHex</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.trust.SignatureChainingParserTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="simple">
+ </a> <!-- simple -->
+ <span class="method-name">simple</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="bean">
+ </a> <!-- bean -->
+ <span class="method-name">bean</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.trust.StaticPKIXSignatureParserTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="certPath">
+ </a> <!-- certPath -->
+ <span class="method-name">certPath</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="nameCheckDisabled">
+ </a> <!-- nameCheckDisabled -->
+ <span class="method-name">nameCheckDisabled</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="simple">
+ </a> <!-- simple -->
+ <span class="method-name">simple</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="values">
+ </a> <!-- values -->
+ <span class="method-name">values</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ <div class="suite-Default_suite-class-passed">
+ <div class="main-panel-header rounded-window-top">
+ <img src="passed.png"/>
+ <span class="class-name">org.opensaml.spring.credential.X509FilesystemParserTest</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="method">
+ <div class="method-content">
+ <a name="certElementsKeyNames">
+ </a> <!-- certElementsKeyNames -->
+ <span class="method-name">certElementsKeyNames</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="certKeyCrl">
+ </a> <!-- certKeyCrl -->
+ <span class="method-name">certKeyCrl</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="certOnly">
+ </a> <!-- certOnly -->
+ <span class="method-name">certOnly</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="twoCert">
+ </a> <!-- twoCert -->
+ <span class="method-name">twoCert</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ <div class="method">
+ <div class="method-content">
+ <a name="wrongCert">
+ </a> <!-- wrongCert -->
+ <span class="method-name">wrongCert</span>
+ </div> <!-- method-content -->
+ </div> <!-- method -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- suite-Default_suite-class-passed -->
+ </div> <!-- panel Default_suite -->
+ <div panel-name="test-xml-Default_suite" class="panel">
+ <div class="main-panel-header rounded-window-top">
+ <span class="header-content">/private/var/folders/5f/xsd8c2ld42l1xrzgghx8hf5r0000gn/T/testng-eclipse--2005517064/testng-customsuite.xml</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <pre>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
+<suite name="Default suite" guice-stage="DEVELOPMENT">
+ <test thread-count="5" name="Default test" verbose="2">
+ <classes>
+ <class name="org.opensaml.spring.credential.BasicResourceParserTest"/>
+ <class name="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest"/>
+ <class name="org.opensaml.spring.trust.StaticExplicitKeyParserTest"/>
+ <class name="org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest"/>
+ <class name="org.opensaml.spring.trust.PKIXValidationOptionsParserTest"/>
+ <class name="org.opensaml.spring.trust.PKIXFilesystemParserTest"/>
+ <class name="org.opensaml.spring.trust.MockTrustEngine"/>
+ <class name="org.opensaml.spring.credential.X509FilesystemParserTest"/>
+ <class name="org.opensaml.spring.credential.X509InlineParserTest"/>
+ <class name="org.opensaml.spring.trust.ChainingTrustEngineTest"/>
+ <class name="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest"/>
+ <class name="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest"/>
+ <class name="org.opensaml.spring.trust.SignatureChainingParserTest"/>
+ <class name="org.opensaml.spring.credential.BasicInlineParserTest"/>
+ <class name="org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest"/>
+ <class name="org.opensaml.spring.trust.PKIXInlineParserTest"/>
+ <class name="org.opensaml.spring.AbstractSecurityParserTest"/>
+ <class name="org.opensaml.spring.trust.StaticPKIXSignatureParserTest"/>
+ </classes>
+ </test> <!-- Default test -->
+</suite> <!-- Default suite -->
+ </pre>
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- panel -->
+ <div panel-name="testlist-Default_suite" class="panel">
+ <div class="main-panel-header rounded-window-top">
+ <span class="header-content">Tests for Default suite</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <ul>
+ <li>
+ <span class="test-name">Default test (18 classes)</span>
+ </li>
+ </ul>
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- panel -->
+ <div panel-name="group-Default_suite" class="panel">
+ <div class="main-panel-header rounded-window-top">
+ <span class="header-content">Groups for Default suite</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- panel -->
+ <div panel-name="times-Default_suite" class="panel">
+ <div class="main-panel-header rounded-window-top">
+ <span class="header-content">Times for Default suite</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="times-div">
+ <script type="text/javascript">
+suiteTableInitFunctions.push('tableData_Default_suite');
+function tableData_Default_suite() {
+var data = new google.visualization.DataTable();
+data.addColumn('number', 'Number');
+data.addColumn('string', 'Method');
+data.addColumn('string', 'Class');
+data.addColumn('number', 'Time (ms)');
+data.addRows(43);
+data.setCell(0, 0, 0)
+data.setCell(0, 1, 'publicOnly')
+data.setCell(0, 2, 'org.opensaml.spring.credential.BasicResourceParserTest')
+data.setCell(0, 3, 639);
+data.setCell(1, 0, 1)
+data.setCell(1, 1, 'mixed')
+data.setCell(1, 2, 'org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest')
+data.setCell(1, 3, 124);
+data.setCell(2, 0, 2)
+data.setCell(2, 1, 'publicPrivate')
+data.setCell(2, 2, 'org.opensaml.spring.credential.BasicResourceParserTest')
+data.setCell(2, 3, 113);
+data.setCell(3, 0, 3)
+data.setCell(3, 1, 'bean')
+data.setCell(3, 2, 'org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest')
+data.setCell(3, 3, 73);
+data.setCell(4, 0, 4)
+data.setCell(4, 1, 'wrongCert')
+data.setCell(4, 2, 'org.opensaml.spring.credential.BasicResourceParserTest')
+data.setCell(4, 3, 68);
+data.setCell(5, 0, 5)
+data.setCell(5, 1, 'certPath')
+data.setCell(5, 2, 'org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest')
+data.setCell(5, 3, 67);
+data.setCell(6, 0, 6)
+data.setCell(6, 1, 'wrongCert')
+data.setCell(6, 2, 'org.opensaml.spring.credential.X509FilesystemParserTest')
+data.setCell(6, 3, 66);
+data.setCell(7, 0, 7)
+data.setCell(7, 1, 'simple')
+data.setCell(7, 2, 'org.opensaml.spring.trust.StaticExplicitKeyParserTest')
+data.setCell(7, 3, 65);
+data.setCell(8, 0, 8)
+data.setCell(8, 1, 'twoCert')
+data.setCell(8, 2, 'org.opensaml.spring.credential.X509FilesystemParserTest')
+data.setCell(8, 3, 63);
+data.setCell(9, 0, 9)
+data.setCell(9, 1, 'singleCert')
+data.setCell(9, 2, 'org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest')
+data.setCell(9, 3, 62);
+data.setCell(10, 0, 10)
+data.setCell(10, 1, 'one')
+data.setCell(10, 2, 'org.opensaml.spring.trust.ChainingTrustEngineTest')
+data.setCell(10, 3, 59);
+data.setCell(11, 0, 11)
+data.setCell(11, 1, 'secretBinary')
+data.setCell(11, 2, 'org.opensaml.spring.credential.BasicResourceParserTest')
+data.setCell(11, 3, 57);
+data.setCell(12, 0, 12)
+data.setCell(12, 1, 'singleKey')
+data.setCell(12, 2, 'org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest')
+data.setCell(12, 3, 55);
+data.setCell(13, 0, 13)
+data.setCell(13, 1, 'customPropertiesFailsValidation')
+data.setCell(13, 2, 'org.opensaml.spring.trust.StaticPKIXFactoryBeanTest')
+data.setCell(13, 3, 51);
+data.setCell(14, 0, 14)
+data.setCell(14, 1, 'multipleCert')
+data.setCell(14, 2, 'org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest')
+data.setCell(14, 3, 51);
+data.setCell(15, 0, 15)
+data.setCell(15, 1, 'certKeyCrl')
+data.setCell(15, 2, 'org.opensaml.spring.credential.X509InlineParserTest')
+data.setCell(15, 3, 49);
+data.setCell(16, 0, 16)
+data.setCell(16, 1, 'complex')
+data.setCell(16, 2, 'org.opensaml.spring.trust.PKIXFilesystemParserTest')
+data.setCell(16, 3, 48);
+data.setCell(17, 0, 17)
+data.setCell(17, 1, 'secretBase64')
+data.setCell(17, 2, 'org.opensaml.spring.credential.BasicResourceParserTest')
+data.setCell(17, 3, 48);
+data.setCell(18, 0, 18)
+data.setCell(18, 1, 'certKeyCrl')
+data.setCell(18, 2, 'org.opensaml.spring.credential.X509FilesystemParserTest')
+data.setCell(18, 3, 45);
+data.setCell(19, 0, 19)
+data.setCell(19, 1, 'values')
+data.setCell(19, 2, 'org.opensaml.spring.trust.StaticPKIXSignatureParserTest')
+data.setCell(19, 3, 44);
+data.setCell(20, 0, 20)
+data.setCell(20, 1, 'simple')
+data.setCell(20, 2, 'org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest')
+data.setCell(20, 3, 44);
+data.setCell(21, 0, 21)
+data.setCell(21, 1, 'two')
+data.setCell(21, 2, 'org.opensaml.spring.trust.ChainingTrustEngineTest')
+data.setCell(21, 3, 38);
+data.setCell(22, 0, 22)
+data.setCell(22, 1, 'nameCheckDisabled')
+data.setCell(22, 2, 'org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest')
+data.setCell(22, 3, 36);
+data.setCell(23, 0, 23)
+data.setCell(23, 1, 'simple')
+data.setCell(23, 2, 'org.opensaml.spring.trust.SignatureChainingParserTest')
+data.setCell(23, 3, 36);
+data.setCell(24, 0, 24)
+data.setCell(24, 1, 'publicPrivate')
+data.setCell(24, 2, 'org.opensaml.spring.credential.BasicInlineParserTest')
+data.setCell(24, 3, 35);
+data.setCell(25, 0, 25)
+data.setCell(25, 1, 'wrongCert')
+data.setCell(25, 2, 'org.opensaml.spring.credential.X509InlineParserTest')
+data.setCell(25, 3, 31);
+data.setCell(26, 0, 26)
+data.setCell(26, 1, 'complex')
+data.setCell(26, 2, 'org.opensaml.spring.trust.PKIXValidationOptionsParserTest')
+data.setCell(26, 3, 29);
+data.setCell(27, 0, 27)
+data.setCell(27, 1, 'secretHex')
+data.setCell(27, 2, 'org.opensaml.spring.credential.BasicResourceParserTest')
+data.setCell(27, 3, 28);
+data.setCell(28, 0, 28)
+data.setCell(28, 1, 'certElementsKeyNames')
+data.setCell(28, 2, 'org.opensaml.spring.credential.X509FilesystemParserTest')
+data.setCell(28, 3, 28);
+data.setCell(29, 0, 29)
+data.setCell(29, 1, 'certOnly')
+data.setCell(29, 2, 'org.opensaml.spring.credential.X509InlineParserTest')
+data.setCell(29, 3, 27);
+data.setCell(30, 0, 30)
+data.setCell(30, 1, 'customPropertiesSuccess')
+data.setCell(30, 2, 'org.opensaml.spring.trust.StaticPKIXFactoryBeanTest')
+data.setCell(30, 3, 25);
+data.setCell(31, 0, 31)
+data.setCell(31, 1, 'nameCheckDisabled')
+data.setCell(31, 2, 'org.opensaml.spring.trust.StaticPKIXSignatureParserTest')
+data.setCell(31, 3, 22);
+data.setCell(32, 0, 32)
+data.setCell(32, 1, 'simple')
+data.setCell(32, 2, 'org.opensaml.spring.trust.PKIXFilesystemParserTest')
+data.setCell(32, 3, 22);
+data.setCell(33, 0, 33)
+data.setCell(33, 1, 'complex')
+data.setCell(33, 2, 'org.opensaml.spring.trust.PKIXInlineParserTest')
+data.setCell(33, 3, 21);
+data.setCell(34, 0, 34)
+data.setCell(34, 1, 'simple')
+data.setCell(34, 2, 'org.opensaml.spring.trust.PKIXInlineParserTest')
+data.setCell(34, 3, 21);
+data.setCell(35, 0, 35)
+data.setCell(35, 1, 'publicOnly')
+data.setCell(35, 2, 'org.opensaml.spring.credential.BasicInlineParserTest')
+data.setCell(35, 3, 21);
+data.setCell(36, 0, 36)
+data.setCell(36, 1, 'simple')
+data.setCell(36, 2, 'org.opensaml.spring.trust.StaticPKIXSignatureParserTest')
+data.setCell(36, 3, 20);
+data.setCell(37, 0, 37)
+data.setCell(37, 1, 'certPath')
+data.setCell(37, 2, 'org.opensaml.spring.trust.StaticPKIXSignatureParserTest')
+data.setCell(37, 3, 20);
+data.setCell(38, 0, 38)
+data.setCell(38, 1, 'simple')
+data.setCell(38, 2, 'org.opensaml.spring.trust.PKIXValidationOptionsParserTest')
+data.setCell(38, 3, 19);
+data.setCell(39, 0, 39)
+data.setCell(39, 1, 'secretBase64')
+data.setCell(39, 2, 'org.opensaml.spring.credential.BasicInlineParserTest')
+data.setCell(39, 3, 17);
+data.setCell(40, 0, 40)
+data.setCell(40, 1, 'secretHex')
+data.setCell(40, 2, 'org.opensaml.spring.credential.BasicInlineParserTest')
+data.setCell(40, 3, 15);
+data.setCell(41, 0, 41)
+data.setCell(41, 1, 'defaults')
+data.setCell(41, 2, 'org.opensaml.spring.trust.StaticPKIXFactoryBeanTest')
+data.setCell(41, 3, 15);
+data.setCell(42, 0, 42)
+data.setCell(42, 1, 'certOnly')
+data.setCell(42, 2, 'org.opensaml.spring.credential.X509FilesystemParserTest')
+data.setCell(42, 3, 13);
+window.suiteTableData['Default_suite']= { tableData: data, tableDiv: 'times-div-Default_suite'}
+return data;
+}
+ </script>
+ <span class="suite-total-time">Total running time: 2 seconds</span>
+ <div id="times-div-Default_suite">
+ </div> <!-- times-div-Default_suite -->
+ </div> <!-- times-div -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- panel -->
+ <div panel-name="reporter-Default_suite" class="panel">
+ <div class="main-panel-header rounded-window-top">
+ <span class="header-content">Reporter output for Default suite</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- panel -->
+ <div panel-name="ignored-methods-Default_suite" class="panel">
+ <div class="main-panel-header rounded-window-top">
+ <span class="header-content">14 ignored methods</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.trust.ChainingTrustEngineTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.trust.PKIXValidationOptionsParserTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.credential.X509InlineParserTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.trust.PKIXInlineParserTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.trust.PKIXFilesystemParserTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.trust.StaticExplicitKeyParserTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.credential.BasicInlineParserTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.trust.StaticPKIXSignatureParserTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.trust.SignatureChainingParserTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.AbstractSecurityParserTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ <div class="ignored-class-div">
+ <span class="ignored-class-name">org.opensaml.spring.credential.X509FilesystemParserTest</span>
+ <div class="ignored-methods-div">
+ <span class="ignored-method-name">setupDirs</span>
+ <br/>
+ </div> <!-- ignored-methods-div -->
+ </div> <!-- ignored-class-div -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- panel -->
+ <div panel-name="chronological-Default_suite" class="panel">
+ <div class="main-panel-header rounded-window-top">
+ <span class="header-content">Methods in chronological order</span>
+ </div> <!-- main-panel-header rounded-window-top -->
+ <div class="main-panel-content rounded-window-bottom">
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.credential.BasicResourceParserTest</div> <!-- chronological-class-name -->
+ <div class="configuration-suite before">
+ <span class="method-name">setupDirs</span>
+ <span class="method-start">0 ms</span>
+ </div> <!-- configuration-suite before -->
+ <div class="test-method">
+ <span class="method-name">publicOnly</span>
+ <span class="method-start">63 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">707 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">publicPrivate</span>
+ <span class="method-start">717 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">833 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">secretBase64</span>
+ <span class="method-start">835 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">885 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">secretBinary</span>
+ <span class="method-start">887 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">946 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">secretHex</span>
+ <span class="method-start">947 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">977 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">wrongCert</span>
+ <span class="method-start">979 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1053 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">mixed</span>
+ <span class="method-start">1059 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1186 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">multipleCert</span>
+ <span class="method-start">1189 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1243 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">singleCert</span>
+ <span class="method-start">1244 ms</span>
+ </div> <!-- test-method -->
+ <div class="test-method">
+ <span class="method-name">singleKey</span>
+ <span class="method-start">1309 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1309 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1365 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.trust.StaticExplicitKeyParserTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">simple</span>
+ <span class="method-start">1366 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1434 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">simple</span>
+ <span class="method-start">1438 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1483 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.trust.PKIXValidationOptionsParserTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">complex</span>
+ <span class="method-start">1484 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1514 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">simple</span>
+ <span class="method-start">1515 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1537 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.trust.PKIXFilesystemParserTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">complex</span>
+ <span class="method-start">1537 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1586 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">simple</span>
+ <span class="method-start">1587 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1611 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.credential.X509FilesystemParserTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">certElementsKeyNames</span>
+ <span class="method-start">1612 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1641 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">certKeyCrl</span>
+ <span class="method-start">1642 ms</span>
+ </div> <!-- test-method -->
+ <div class="test-method">
+ <span class="method-name">certOnly</span>
+ <span class="method-start">1690 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1690 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1703 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">twoCert</span>
+ <span class="method-start">1704 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1771 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">wrongCert</span>
+ <span class="method-start">1775 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1845 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.credential.X509InlineParserTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">certKeyCrl</span>
+ <span class="method-start">1847 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1897 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">certOnly</span>
+ <span class="method-start">1898 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1928 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">wrongCert</span>
+ <span class="method-start">1931 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">1965 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.trust.ChainingTrustEngineTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">one</span>
+ <span class="method-start">1966 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2026 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">two</span>
+ <span class="method-start">2030 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2070 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">certPath</span>
+ <span class="method-start">2077 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2146 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">nameCheckDisabled</span>
+ <span class="method-start">2147 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2183 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.trust.StaticPKIXFactoryBeanTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">customPropertiesFailsValidation</span>
+ <span class="method-start">2184 ms</span>
+ </div> <!-- test-method -->
+ <div class="test-method">
+ <span class="method-name">customPropertiesSuccess</span>
+ <span class="method-start">2237 ms</span>
+ </div> <!-- test-method -->
+ <div class="test-method">
+ <span class="method-name">defaults</span>
+ <span class="method-start">2263 ms</span>
+ </div> <!-- test-method -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.trust.SignatureChainingParserTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">simple</span>
+ <span class="method-start">2280 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2317 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.credential.BasicInlineParserTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">publicOnly</span>
+ <span class="method-start">2318 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2340 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">publicPrivate</span>
+ <span class="method-start">2341 ms</span>
+ </div> <!-- test-method -->
+ <div class="test-method">
+ <span class="method-name">secretBase64</span>
+ <span class="method-start">2378 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2378 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2396 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">secretHex</span>
+ <span class="method-start">2399 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2415 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">bean</span>
+ <span class="method-start">2416 ms</span>
+ </div> <!-- test-method -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.trust.PKIXInlineParserTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">complex</span>
+ <span class="method-start">2494 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2516 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">simple</span>
+ <span class="method-start">2518 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2540 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- chronological-class -->
+ <div class="chronological-class">
+ <div class="chronological-class-name">org.opensaml.spring.trust.StaticPKIXSignatureParserTest</div> <!-- chronological-class-name -->
+ <div class="test-method">
+ <span class="method-name">certPath</span>
+ <span class="method-start">2541 ms</span>
+ </div> <!-- test-method -->
+ <div class="test-method">
+ <span class="method-name">nameCheckDisabled</span>
+ <span class="method-start">2562 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2562 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2585 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">simple</span>
+ <span class="method-start">2586 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2607 ms</span>
+ </div> <!-- configuration-method after -->
+ <div class="test-method">
+ <span class="method-name">values</span>
+ <span class="method-start">2608 ms</span>
+ </div> <!-- test-method -->
+ <div class="configuration-method after">
+ <span class="method-name">tearDownTestContext</span>
+ <span class="method-start">2654 ms</span>
+ </div> <!-- configuration-method after -->
+ </div> <!-- main-panel-content rounded-window-bottom -->
+ </div> <!-- panel -->
+ </div> <!-- main-panel-root -->
+ </div> <!-- wrapper -->
+ </body>
+<script type="text/javascript" src="testng-reports2.js"></script>
+</html>
diff --git a/opensaml-spring/test-output/jquery.min.js b/opensaml-spring/test-output/jquery.min.js
new file mode 100644
index 000000000..b0614034a
--- /dev/null
+++ b/opensaml-spring/test-output/jquery.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l= [...]
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicInlineParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicInlineParserTest.xml
new file mode 100644
index 000000000..29feccab1
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicInlineParserTest.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="4" name="org.opensaml.spring.credential.BasicInlineParserTest" time="0.092" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="publicPrivate" time="0.037"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="publicOnly" time="0.022"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="secretBase64" time="0.018"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="secretHex" time="0.015"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.credential.BasicInlineParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicResourceParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicResourceParserTest.xml
new file mode 100644
index 000000000..2c015bbaf
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicResourceParserTest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="6" name="org.opensaml.spring.credential.BasicResourceParserTest" time="0.969" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="publicOnly" time="0.641"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="secretHex" time="0.030"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="secretBase64" time="0.050"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="publicPrivate" time="0.114"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="secretBinary" time="0.058"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="wrongCert" time="0.076"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.credential.BasicResourceParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest.xml
new file mode 100644
index 000000000..c6aef4d0a
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="1" name="org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest" time="0.073" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest" name="bean" time="0.073"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.X509FilesystemParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.X509FilesystemParserTest.xml
new file mode 100644
index 000000000..e1379df2f
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.X509FilesystemParserTest.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="5" name="org.opensaml.spring.credential.X509FilesystemParserTest" time="0.220" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="twoCert" time="0.066"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="wrongCert" time="0.067"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="certKeyCrl" time="0.045"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="certElementsKeyNames" time="0.029"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="certOnly" time="0.013"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.credential.X509FilesystemParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.X509InlineParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.X509InlineParserTest.xml
new file mode 100644
index 000000000..616d227aa
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.X509InlineParserTest.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="3" name="org.opensaml.spring.credential.X509InlineParserTest" time="0.109" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.credential.X509InlineParserTest" name="certOnly" time="0.028"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.X509InlineParserTest" name="wrongCert" time="0.032"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.credential.X509InlineParserTest" name="certKeyCrl" time="0.049"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.credential.X509InlineParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.ChainingTrustEngineTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.ChainingTrustEngineTest.xml
new file mode 100644
index 000000000..8400bf92d
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.ChainingTrustEngineTest.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="2" name="org.opensaml.spring.trust.ChainingTrustEngineTest" time="0.106" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.trust.ChainingTrustEngineTest" name="two" time="0.044"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.ChainingTrustEngineTest" name="one" time="0.062"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.ChainingTrustEngineTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXFilesystemParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXFilesystemParserTest.xml
new file mode 100644
index 000000000..4338a7083
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXFilesystemParserTest.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="2" name="org.opensaml.spring.trust.PKIXFilesystemParserTest" time="0.072" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.trust.PKIXFilesystemParserTest" name="complex" time="0.049"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.PKIXFilesystemParserTest" name="simple" time="0.023"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.PKIXFilesystemParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXInlineParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXInlineParserTest.xml
new file mode 100644
index 000000000..8496b2dd8
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXInlineParserTest.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="2" name="org.opensaml.spring.trust.PKIXInlineParserTest" time="0.044" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.trust.PKIXInlineParserTest" name="complex" time="0.021"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.PKIXInlineParserTest" name="simple" time="0.023"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.PKIXInlineParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXValidationOptionsParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXValidationOptionsParserTest.xml
new file mode 100644
index 000000000..60017c08b
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXValidationOptionsParserTest.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="2" name="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" time="0.049" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" name="complex" time="0.029"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" name="simple" time="0.020"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.PKIXValidationOptionsParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.SignatureChainingParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.SignatureChainingParserTest.xml
new file mode 100644
index 000000000..cbdb373dd
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.SignatureChainingParserTest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="1" name="org.opensaml.spring.trust.SignatureChainingParserTest" time="0.037" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.trust.SignatureChainingParserTest" name="simple" time="0.037"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.SignatureChainingParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.xml
new file mode 100644
index 000000000..12ea0d553
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="4" name="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" time="0.296" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="mixed" time="0.127"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="singleCert" time="0.062"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="singleKey" time="0.055"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="multipleCert" time="0.052"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeyParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeyParserTest.xml
new file mode 100644
index 000000000..353cf1532
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeyParserTest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="1" name="org.opensaml.spring.trust.StaticExplicitKeyParserTest" time="0.066" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyParserTest" name="simple" time="0.066"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.StaticExplicitKeyParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest.xml
new file mode 100644
index 000000000..56fecbf30
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="1" name="org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest" time="0.045" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest" name="simple" time="0.045"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.xml
new file mode 100644
index 000000000..e6284e842
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="3" name="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" time="0.091" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" name="customPropertiesFailsValidation" time="0.051"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" name="customPropertiesSuccess" time="0.025"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" name="defaults" time="0.015"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.StaticPKIXFactoryBeanTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXSignatureParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXSignatureParserTest.xml
new file mode 100644
index 000000000..4d15490b3
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXSignatureParserTest.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="4" name="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" time="0.108" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="simple" time="0.020"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="values" time="0.044"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="certPath" time="0.021"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="nameCheckDisabled" time="0.023"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.StaticPKIXSignatureParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest.xml
new file mode 100644
index 000000000..eae852b75
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="2" name="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" time="0.105" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" name="certPath" time="0.068"/>
+ <system-out/>
+ <testcase classname="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" name="nameCheckDisabled" time="0.037"/>
+ <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest -->
diff --git a/opensaml-spring/test-output/navigator-bullet.png b/opensaml-spring/test-output/navigator-bullet.png
new file mode 100644
index 000000000..36d90d395
Binary files /dev/null and b/opensaml-spring/test-output/navigator-bullet.png differ
diff --git a/opensaml-spring/test-output/old/Default suite/Default test.properties b/opensaml-spring/test-output/old/Default suite/Default test.properties
new file mode 100644
index 000000000..37da032f9
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/Default test.properties
@@ -0,0 +1 @@
+[SuiteResult context=Default test]
\ No newline at end of file
diff --git a/opensaml-spring/test-output/old/Default suite/classes.html b/opensaml-spring/test-output/old/Default suite/classes.html
new file mode 100644
index 000000000..5bc32a8d7
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/classes.html
@@ -0,0 +1,522 @@
+<table border='1'>
+<tr>
+<th>Class name</th>
+<th>Method name</th>
+<th>Groups</th>
+</tr><tr>
+<td>org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>secretHex</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>secretBase64</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>publicPrivate</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>publicOnly</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>wrongCert</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>secretBinary</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>singleCert</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>multipleCert</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>mixed</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>singleKey</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.StaticExplicitKeyParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.PKIXValidationOptionsParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>complex</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.PKIXFilesystemParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>complex</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.credential.X509FilesystemParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>certKeyCrl</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>wrongCert</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>certOnly</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>certElementsKeyNames</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>twoCert</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.credential.X509InlineParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>certKeyCrl</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>wrongCert</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>certOnly</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.ChainingTrustEngineTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>one</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>two</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>certPath</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>nameCheckDisabled</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.StaticPKIXFactoryBeanTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>customPropertiesSuccess</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>defaults</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>customPropertiesFailsValidation</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.SignatureChainingParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.credential.BasicInlineParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>secretHex</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>secretBase64</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>publicPrivate</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>publicOnly</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>bean</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.PKIXInlineParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>complex</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.StaticPKIXSignatureParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>certPath</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>values</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>nameCheckDisabled</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+</table>
diff --git a/opensaml-spring/test-output/old/Default suite/groups.html b/opensaml-spring/test-output/old/Default suite/groups.html
new file mode 100644
index 000000000..199cb3f11
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/groups.html
@@ -0,0 +1 @@
+<h2>Groups used for this test run</h2>
\ No newline at end of file
diff --git a/opensaml-spring/test-output/old/Default suite/index.html b/opensaml-spring/test-output/old/Default suite/index.html
new file mode 100644
index 000000000..8ed202c3b
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/index.html
@@ -0,0 +1,6 @@
+<html><head><title>Results for Default suite</title></head>
+<frameset cols="26%,74%">
+<frame src="toc.html" name="navFrame">
+<frame src="main.html" name="mainFrame">
+</frameset>
+</html>
diff --git a/opensaml-spring/test-output/old/Default suite/main.html b/opensaml-spring/test-output/old/Default suite/main.html
new file mode 100644
index 000000000..5888ae074
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/main.html
@@ -0,0 +1,2 @@
+<html><head><title>Results for Default suite</title></head>
+<body>Select a result on the left-hand pane.</body></html>
diff --git a/opensaml-spring/test-output/old/Default suite/methods-alphabetical.html b/opensaml-spring/test-output/old/Default suite/methods-alphabetical.html
new file mode 100644
index 000000000..d554b9445
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/methods-alphabetical.html
@@ -0,0 +1,170 @@
+<h2>Methods run, sorted chronologically</h2><h3>>> means before, << means after</h3><p/><br/><em>Default suite</em><p/><small><i>(Hover the method name to see the test class name)</i></small><p/>
+<table border="1">
+<tr><th>Time</th><th>Delta (ms)</th><th>Suite<br>configuration</th><th>Test<br>configuration</th><th>Class<br>configuration</th><th>Groups<br>configuration</th><th>Method<br>configuration</th><th>Test<br>method</th><th>Thread</th><th>Instances</th></tr>
+<tr bgcolor="6aecbc"> <td>22/06/08 10:36:16</td> <td>0</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicX509CredentialFactoryBeanTest.bean()[pri:0, instance:org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest at 29e495ff]">bean</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7fb3a0"> <td>22/06/08 10:36:16</td> <td>-804</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.certElementsKeyNames()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">certElementsKeyNames</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="71e976"> <td>22/06/08 10:36:16</td> <td>-569</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509InlineParserTest.certKeyCrl()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]">certKeyCrl</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7fb3a0"> <td>22/06/08 10:36:16</td> <td>-774</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.certKeyCrl()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">certKeyCrl</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7fb3a0"> <td>22/06/08 10:36:16</td> <td>-726</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.certOnly()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">certOnly</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="71e976"> <td>22/06/08 10:36:16</td> <td>-518</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509InlineParserTest.certOnly()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]">certOnly</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="707274"> <td>22/06/08 10:36:16</td> <td>-339</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXX509CredentialParserTest.certPath()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]">certPath</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="d4a5c2"> <td>22/06/08 10:36:16</td> <td>125</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.certPath()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">certPath</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="d296da"> <td>22/06/08 10:36:16</td> <td>78</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXInlineParserTest.complex()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]">complex</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="71beb3"> <td>22/06/08 10:36:15</td> <td>-932</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXValidationOptionsParserTest.complex()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]">complex</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="999590"> <td>22/06/08 10:36:15</td> <td>-879</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXFilesystemParserTest.complex()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]">complex</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="c9d689"> <td>22/06/08 10:36:16</td> <td>-232</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXFactoryBeanTest.customPropertiesFailsValidation()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]">customPropertiesFailsValidation</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="c9d689"> <td>22/06/08 10:36:16</td> <td>-179</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXFactoryBeanTest.customPropertiesSuccess()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]">customPropertiesSuccess</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="c9d689"> <td>22/06/08 10:36:16</td> <td>-153</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXFactoryBeanTest.defaults()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]">defaults</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="9379b4"> <td>22/06/08 10:36:15</td> <td>-1357</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.mixed()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">mixed</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="9379b4"> <td>22/06/08 10:36:15</td> <td>-1227</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.multipleCert()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">multipleCert</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="d4a5c2"> <td>22/06/08 10:36:16</td> <td>146</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.nameCheckDisabled()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">nameCheckDisabled</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="707274"> <td>22/06/08 10:36:16</td> <td>-269</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXX509CredentialParserTest.nameCheckDisabled()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]">nameCheckDisabled</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="fc69bd"> <td>22/06/08 10:36:16</td> <td>-450</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="ChainingTrustEngineTest.one()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]">one</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="83b0a5"> <td>22/06/08 10:36:14</td> <td>-2353</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.publicOnly()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">publicOnly</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7abbaa"> <td>22/06/08 10:36:16</td> <td>-98</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.publicOnly()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">publicOnly</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="83b0a5"> <td>22/06/08 10:36:15</td> <td>-1699</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.publicPrivate()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">publicPrivate</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7abbaa"> <td>22/06/08 10:36:16</td> <td>-75</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.publicPrivate()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">publicPrivate</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="83b0a5"> <td>22/06/08 10:36:15</td> <td>-1581</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.secretBase64()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">secretBase64</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7abbaa"> <td>22/06/08 10:36:16</td> <td>-38</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.secretBase64()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">secretBase64</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="83b0a5"> <td>22/06/08 10:36:15</td> <td>-1529</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.secretBinary()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">secretBinary</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7abbaa"> <td>22/06/08 10:36:16</td> <td>-17</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.secretHex()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">secretHex</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="83b0a5"> <td>22/06/08 10:36:15</td> <td>-1469</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.secretHex()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">secretHex</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:14</td> <td>-2410</td> <td title=">>AbstractSecurityParserTest.setupDirs()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">>>setupDirs</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="d4a5c2"> <td>22/06/08 10:36:16</td> <td>170</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="c1bd8b"> <td>22/06/08 10:36:15</td> <td>-1050</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="71beb3"> <td>22/06/08 10:36:15</td> <td>-901</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXValidationOptionsParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="d296da"> <td>22/06/08 10:36:16</td> <td>102</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXInlineParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="6e82ae"> <td>22/06/08 10:36:15</td> <td>-978</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeySignatureParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="bf6da9"> <td>22/06/08 10:36:16</td> <td>-136</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="SignatureChainingParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="999590"> <td>22/06/08 10:36:16</td> <td>-829</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXFilesystemParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="9379b4"> <td>22/06/08 10:36:15</td> <td>-1172</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.singleCert()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">singleCert</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="9379b4"> <td>22/06/08 10:36:15</td> <td>-1107</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.singleKey()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">singleKey</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>124</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1362</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-570</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-879</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-232</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-345</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1051</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-805</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-451</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-451</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-982</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1051</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-805</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1051</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1362</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-570</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1362</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-933</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>124</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1362</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1362</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:17</td> <td>238</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-232</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:17</td> <td>238</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-99</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>0</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>0</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:17</td> <td>238</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-879</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-570</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-570</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-570</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-345</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>0</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1051</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>0</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1362</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-451</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:17</td> <td>238</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="fc69bd"> <td>22/06/08 10:36:16</td> <td>-386</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="ChainingTrustEngineTest.two()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]">two</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7fb3a0"> <td>22/06/08 10:36:16</td> <td>-712</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.twoCert()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">twoCert</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="d4a5c2"> <td>22/06/08 10:36:17</td> <td>192</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.values()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">values</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="83b0a5"> <td>22/06/08 10:36:15</td> <td>-1437</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.wrongCert()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">wrongCert</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7fb3a0"> <td>22/06/08 10:36:16</td> <td>-641</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.wrongCert()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">wrongCert</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="71e976"> <td>22/06/08 10:36:16</td> <td>-485</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509InlineParserTest.wrongCert()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]">wrongCert</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+</table>
diff --git a/opensaml-spring/test-output/old/Default suite/methods-not-run.html b/opensaml-spring/test-output/old/Default suite/methods-not-run.html
new file mode 100644
index 000000000..bfa9dc58d
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/methods-not-run.html
@@ -0,0 +1,16 @@
+<h2>Methods that were not run</h2><table>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+</table>
\ No newline at end of file
diff --git a/opensaml-spring/test-output/old/Default suite/methods.html b/opensaml-spring/test-output/old/Default suite/methods.html
new file mode 100644
index 000000000..b34b2f4e7
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/methods.html
@@ -0,0 +1,170 @@
+<h2>Methods run, sorted chronologically</h2><h3>>> means before, << means after</h3><p/><br/><em>Default suite</em><p/><small><i>(Hover the method name to see the test class name)</i></small><p/>
+<table border="1">
+<tr><th>Time</th><th>Delta (ms)</th><th>Suite<br>configuration</th><th>Test<br>configuration</th><th>Class<br>configuration</th><th>Groups<br>configuration</th><th>Method<br>configuration</th><th>Test<br>method</th><th>Thread</th><th>Instances</th></tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>0</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="d296da"> <td>22/06/08 10:36:16</td> <td>-46</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXInlineParserTest.complex()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]">complex</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="d4a5c2"> <td>22/06/08 10:36:16</td> <td>46</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1486</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-694</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="9379b4"> <td>22/06/08 10:36:15</td> <td>-1481</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.mixed()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">mixed</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7fb3a0"> <td>22/06/08 10:36:16</td> <td>-836</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.twoCert()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">twoCert</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1003</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-356</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="83b0a5"> <td>22/06/08 10:36:15</td> <td>-1561</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.wrongCert()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">wrongCert</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-469</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="9379b4"> <td>22/06/08 10:36:15</td> <td>-1231</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.singleKey()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">singleKey</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="71e976"> <td>22/06/08 10:36:16</td> <td>-693</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509InlineParserTest.certKeyCrl()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]">certKeyCrl</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="c1bd8b"> <td>22/06/08 10:36:15</td> <td>-1174</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1175</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-929</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="c9d689"> <td>22/06/08 10:36:16</td> <td>-356</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXFactoryBeanTest.customPropertiesFailsValidation()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]">customPropertiesFailsValidation</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:14</td> <td>-2534</td> <td title=">>AbstractSecurityParserTest.setupDirs()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">>>setupDirs</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7fb3a0"> <td>22/06/08 10:36:16</td> <td>-898</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.certKeyCrl()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">certKeyCrl</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-575</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-575</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="71beb3"> <td>22/06/08 10:36:15</td> <td>-1025</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXValidationOptionsParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="d4a5c2"> <td>22/06/08 10:36:16</td> <td>22</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.nameCheckDisabled()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">nameCheckDisabled</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="9379b4"> <td>22/06/08 10:36:15</td> <td>-1351</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.multipleCert()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">multipleCert</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7abbaa"> <td>22/06/08 10:36:16</td> <td>-141</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.secretHex()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">secretHex</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7fb3a0"> <td>22/06/08 10:36:16</td> <td>-850</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.certOnly()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">certOnly</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="d296da"> <td>22/06/08 10:36:16</td> <td>-22</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXInlineParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1106</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="83b0a5"> <td>22/06/08 10:36:14</td> <td>-2477</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.publicOnly()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">publicOnly</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="83b0a5"> <td>22/06/08 10:36:15</td> <td>-1823</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.publicPrivate()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">publicPrivate</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7fb3a0"> <td>22/06/08 10:36:16</td> <td>-765</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.wrongCert()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">wrongCert</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="71e976"> <td>22/06/08 10:36:16</td> <td>-609</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509InlineParserTest.wrongCert()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]">wrongCert</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7fb3a0"> <td>22/06/08 10:36:16</td> <td>-928</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.certElementsKeyNames()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">certElementsKeyNames</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1175</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="71e976"> <td>22/06/08 10:36:16</td> <td>-642</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509InlineParserTest.certOnly()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]">certOnly</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-929</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1175</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1486</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="71beb3"> <td>22/06/08 10:36:15</td> <td>-1056</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXValidationOptionsParserTest.complex()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]">complex</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-694</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1486</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="999590"> <td>22/06/08 10:36:15</td> <td>-1003</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXFilesystemParserTest.complex()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]">complex</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7abbaa"> <td>22/06/08 10:36:16</td> <td>-199</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.publicPrivate()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">publicPrivate</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="d4a5c2"> <td>22/06/08 10:36:17</td> <td>68</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.values()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">values</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="fc69bd"> <td>22/06/08 10:36:16</td> <td>-574</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="ChainingTrustEngineTest.one()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]">one</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1057</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>0</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1486</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1486</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:17</td> <td>114</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="83b0a5"> <td>22/06/08 10:36:15</td> <td>-1593</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.secretHex()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">secretHex</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-356</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:17</td> <td>114</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-223</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-124</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="83b0a5"> <td>22/06/08 10:36:15</td> <td>-1653</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.secretBinary()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">secretBinary</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="707274"> <td>22/06/08 10:36:16</td> <td>-463</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXX509CredentialParserTest.certPath()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]">certPath</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-124</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="707274"> <td>22/06/08 10:36:16</td> <td>-393</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXX509CredentialParserTest.nameCheckDisabled()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]">nameCheckDisabled</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="d4a5c2"> <td>22/06/08 10:36:16</td> <td>1</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.certPath()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">certPath</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="6aecbc"> <td>22/06/08 10:36:16</td> <td>-124</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicX509CredentialFactoryBeanTest.bean()[pri:0, instance:org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest at 29e495ff]">bean</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:17</td> <td>114</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1003</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-694</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="6e82ae"> <td>22/06/08 10:36:15</td> <td>-1102</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeySignatureParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="fc69bd"> <td>22/06/08 10:36:16</td> <td>-510</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="ChainingTrustEngineTest.two()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]">two</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-694</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="83b0a5"> <td>22/06/08 10:36:15</td> <td>-1705</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.secretBase64()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">secretBase64</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7abbaa"> <td>22/06/08 10:36:16</td> <td>-222</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.publicOnly()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">publicOnly</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-694</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="bf6da9"> <td>22/06/08 10:36:16</td> <td>-260</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="SignatureChainingParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7abbaa"> <td>22/06/08 10:36:16</td> <td>-162</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.secretBase64()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">secretBase64</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="c9d689"> <td>22/06/08 10:36:16</td> <td>-277</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXFactoryBeanTest.defaults()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]">defaults</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-469</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-124</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1175</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-124</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:15</td> <td>-1486</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="999590"> <td>22/06/08 10:36:16</td> <td>-953</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXFilesystemParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]">simple</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="9379b4"> <td>22/06/08 10:36:15</td> <td>-1296</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.singleCert()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">singleCert</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="c9d689"> <td>22/06/08 10:36:16</td> <td>-303</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXFactoryBeanTest.customPropertiesSuccess()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]">customPropertiesSuccess</td>
+ <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:16</td> <td>-575</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+<tr bgcolor="7a66ec"> <td>22/06/08 10:36:17</td> <td>114</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td>
+<td> </td> <td>main at 1839337592</td> <td></td> </tr>
+</table>
diff --git a/opensaml-spring/test-output/old/Default suite/reporter-output.html b/opensaml-spring/test-output/old/Default suite/reporter-output.html
new file mode 100644
index 000000000..063bc2e96
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/reporter-output.html
@@ -0,0 +1 @@
+<h2>Reporter output</h2><table></table>
\ No newline at end of file
diff --git a/opensaml-spring/test-output/old/Default suite/testng.xml.html b/opensaml-spring/test-output/old/Default suite/testng.xml.html
new file mode 100644
index 000000000..e294976d6
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/testng.xml.html
@@ -0,0 +1 @@
+<html><head><title>testng.xml for Default suite</title></head><body><tt><?xml version="1.0" encoding="UTF-8"?><br/><!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"><br/><suite name="Default suite" guice-stage="DEVELOPMENT"><br/> <test thread-count="5" name="Default test" verbose="2"><br/> <classes><br/> <class nam [...]
\ No newline at end of file
diff --git a/opensaml-spring/test-output/old/Default suite/toc.html b/opensaml-spring/test-output/old/Default suite/toc.html
new file mode 100644
index 000000000..4e9703aa4
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/toc.html
@@ -0,0 +1,30 @@
+<html>
+<head>
+<title>Results for Default suite</title>
+<link href="../testng.css" rel="stylesheet" type="text/css" />
+<link href="../my-testng.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<h3><p align="center">Results for<br/><em>Default suite</em></p></h3>
+<table border='1' width='100%'>
+<tr valign='top'>
+<td>1 test</td>
+<td><a target='mainFrame' href='classes.html'>16 classes</a></td>
+<td>43 methods:<br/>
+ <a target='mainFrame' href='methods.html'>chronological</a><br/>
+ <a target='mainFrame' href='methods-alphabetical.html'>alphabetical</a><br/>
+ <a target='mainFrame' href='methods-not-run.html'>not run (14)</a></td>
+</tr>
+<tr>
+<td><a target='mainFrame' href='groups.html'>0 group</a></td>
+<td><a target='mainFrame' href='reporter-output.html'>reporter output</a></td>
+<td><a target='mainFrame' href='testng.xml.html'>testng.xml</a></td>
+</tr></table>
+<table width='100%' class='test-passed'>
+<tr><td>
+<table style='width: 100%'><tr><td valign='top'>Default test (43/0/0)</td><td valign='top' align='right'>
+ <a href='Default test.html' target='mainFrame'>Results</a>
+</td></tr></table>
+</td></tr><p/>
+</table>
+</body></html>
\ No newline at end of file
diff --git a/opensaml-spring/test-output/old/index.html b/opensaml-spring/test-output/old/index.html
new file mode 100644
index 000000000..e33722098
--- /dev/null
+++ b/opensaml-spring/test-output/old/index.html
@@ -0,0 +1,9 @@
+<html>
+<head><title></title><link href="./testng.css" rel="stylesheet" type="text/css" />
+<link href="./my-testng.css" rel="stylesheet" type="text/css" />
+</head><body>
+<h2><p align='center'>Test results</p></h2>
+<table border='1' width='100%' class='main-page'><tr><th>Suite</th><th>Passed</th><th>Failed</th><th>Skipped</th><th>testng.xml</th></tr>
+<tr align='center' class='invocation-passed'><td><em>Total</em></td><td><em>43</em></td><td><em>0</em></td><td><em>0</em></td><td> </td></tr>
+<tr align='center' class='invocation-passed'><td><a href='Default suite/index.html'>Default suite</a></td>
+<td>43</td><td>0</td><td>0</td><td><a href='Default suite/testng.xml.html'>Link</a></td></tr></table></body></html>
diff --git a/opensaml-spring/test-output/passed.png b/opensaml-spring/test-output/passed.png
new file mode 100644
index 000000000..45e85bbfd
Binary files /dev/null and b/opensaml-spring/test-output/passed.png differ
diff --git a/opensaml-spring/test-output/skipped.png b/opensaml-spring/test-output/skipped.png
new file mode 100644
index 000000000..c36a32439
Binary files /dev/null and b/opensaml-spring/test-output/skipped.png differ
diff --git a/opensaml-spring/test-output/testng-failed.xml b/opensaml-spring/test-output/testng-failed.xml
new file mode 100644
index 000000000..071c33d5e
--- /dev/null
+++ b/opensaml-spring/test-output/testng-failed.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
+<suite name="Failed suite [Default suite]" guice-stage="DEVELOPMENT">
+ <test thread-count="5" name="Default test(failed)">
+ <classes>
+ <class name="org.opensaml.spring.trust.PKIXFilesystemParserTest">
+ <methods>
+ <include name="setupDirs"/>
+ <include name="tearDownTestContext"/>
+ <include name="complex"/>
+ </methods>
+ </class> <!-- org.opensaml.spring.trust.PKIXFilesystemParserTest -->
+ </classes>
+ </test> <!-- Default test(failed) -->
+</suite> <!-- Failed suite [Default suite] -->
diff --git a/opensaml-spring/test-output/testng-reports.css b/opensaml-spring/test-output/testng-reports.css
new file mode 100644
index 000000000..d7b75c404
--- /dev/null
+++ b/opensaml-spring/test-output/testng-reports.css
@@ -0,0 +1,326 @@
+body {
+ margin: 0 0 5px 5px;
+}
+
+ul {
+ margin: 0;
+}
+
+li {
+ list-style-type: none;
+}
+
+a {
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+.navigator-selected {
+ background: #ffa500;
+}
+
+.wrapper {
+ position: absolute;
+ top: 60px;
+ bottom: 0;
+ left: 400px;
+ right: 0;
+ overflow: auto;
+}
+
+.navigator-root {
+ position: absolute;
+ top: 60px;
+ bottom: 0;
+ left: 0;
+ width: 400px;
+ overflow-y: auto;
+}
+
+.suite {
+ margin: 0 10px 10px 0;
+ background-color: #fff8dc;
+}
+
+.suite-name {
+ padding-left: 10px;
+ font-size: 25px;
+ font-family: Times, sans-serif;
+}
+
+.main-panel-header {
+ padding: 5px;
+ background-color: #9FB4D9; /*afeeee*/;
+ font-family: monospace;
+ font-size: 18px;
+}
+
+.main-panel-content {
+ padding: 5px;
+ margin-bottom: 10px;
+ background-color: #DEE8FC; /*d0ffff*/;
+}
+
+.rounded-window {
+ border-radius: 10px;
+ border-style: solid;
+ border-width: 1px;
+}
+
+.rounded-window-top {
+ border-top-right-radius: 10px 10px;
+ border-top-left-radius: 10px 10px;
+ border-style: solid;
+ border-width: 1px;
+ overflow: auto;
+}
+
+.light-rounded-window-top {
+ border-top-right-radius: 10px 10px;
+ border-top-left-radius: 10px 10px;
+}
+
+.rounded-window-bottom {
+ border-style: solid;
+ border-width: 0 1px 1px 1px;
+ border-bottom-right-radius: 10px 10px;
+ border-bottom-left-radius: 10px 10px;
+ overflow: auto;
+}
+
+.method-name {
+ font-size: 12px;
+ font-family: monospace;
+}
+
+.method-content {
+ border-style: solid;
+ border-width: 0 0 1px 0;
+ margin-bottom: 10px;
+ padding-bottom: 5px;
+ width: 80%;
+}
+
+.parameters {
+ font-size: 14px;
+ font-family: monospace;
+}
+
+.stack-trace {
+ white-space: pre;
+ font-family: monospace;
+ font-size: 12px;
+ font-weight: bold;
+ margin-top: 0;
+ margin-left: 20px;
+}
+
+.testng-xml {
+ font-family: monospace;
+}
+
+.method-list-content {
+ margin-left: 10px;
+}
+
+.navigator-suite-content {
+ margin-left: 10px;
+ font: 12px 'Lucida Grande';
+}
+
+.suite-section-title {
+ margin-top: 10px;
+ width: 80%;
+ border-style: solid;
+ border-width: 1px 0 0 0;
+ font-family: Times, sans-serif;
+ font-size: 18px;
+ font-weight: bold;
+}
+
+.suite-section-content {
+ list-style-image: url(bullet_point.png);
+}
+
+.top-banner-root {
+ position: absolute;
+ top: 0;
+ height: 45px;
+ left: 0;
+ right: 0;
+ padding: 5px;
+ margin: 0 0 5px 0;
+ background-color: #0066ff;
+ font-family: Times, sans-serif;
+ color: #fff;
+ text-align: center;
+}
+.button{
+ position: absolute;
+ margin-left:500px;
+ margin-top:8px;
+ background-color: white;
+ color:#0066ff;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-weight:bold;
+ border-color:#0066ff ;
+ border-radius:25px;
+ cursor: pointer;
+ height:30px;
+ width:150px;
+ outline:none;
+
+}
+
+.top-banner-title-font {
+ font-size: 25px;
+}
+
+.test-name {
+ font-family: 'Lucida Grande', sans-serif;
+ font-size: 16px;
+}
+
+.suite-icon {
+ padding: 5px;
+ float: right;
+ height: 20px;
+}
+
+.test-group {
+ font: 20px 'Lucida Grande';
+ margin: 5px 5px 10px 5px;
+ border-width: 0 0 1px 0;
+ border-style: solid;
+ padding: 5px;
+}
+
+.test-group-name {
+ font-weight: bold;
+}
+
+.method-in-group {
+ font-size: 16px;
+ margin-left: 80px;
+}
+
+table.google-visualization-table-table {
+ width: 100%;
+}
+
+.reporter-method-name {
+ font-size: 14px;
+ font-family: monospace;
+}
+
+.reporter-method-output-div {
+ padding: 5px;
+ margin: 0 0 5px 20px;
+ font-size: 12px;
+ font-family: monospace;
+ border-width: 0 0 0 1px;
+ border-style: solid;
+}
+
+.ignored-class-div {
+ font-size: 14px;
+ font-family: monospace;
+}
+
+.ignored-methods-div {
+ padding: 5px;
+ margin: 0 0 5px 20px;
+ font-size: 12px;
+ font-family: monospace;
+ border-width: 0 0 0 1px;
+ border-style: solid;
+}
+
+.border-failed {
+ border-top-left-radius: 10px 10px;
+ border-bottom-left-radius: 10px 10px;
+ border-style: solid;
+ border-width: 0 0 0 10px;
+ border-color: #f00;
+}
+
+.border-skipped {
+ border-top-left-radius: 10px 10px;
+ border-bottom-left-radius: 10px 10px;
+ border-style: solid;
+ border-width: 0 0 0 10px;
+ border-color: #edc600;
+}
+
+.border-passed {
+ border-top-left-radius: 10px 10px;
+ border-bottom-left-radius: 10px 10px;
+ border-style: solid;
+ border-width: 0 0 0 10px;
+ border-color: #19f52d;
+}
+
+.times-div {
+ text-align: center;
+ padding: 5px;
+}
+
+.suite-total-time {
+ font: 16px 'Lucida Grande';
+}
+
+.configuration-suite {
+ margin-left: 20px;
+}
+
+.configuration-test {
+ margin-left: 40px;
+}
+
+.configuration-class {
+ margin-left: 60px;
+}
+
+.configuration-method {
+ margin-left: 80px;
+}
+
+.test-method {
+ margin-left: 100px;
+}
+
+.chronological-class {
+ background-color: skyblue;
+ border-style: solid;
+ border-width: 0 0 1px 1px;
+}
+
+.method-start {
+ float: right;
+}
+
+.chronological-class-name {
+ padding: 0 0 0 5px;
+ color: #008;
+}
+
+.after, .before, .test-method {
+ font-family: monospace;
+ font-size: 14px;
+}
+
+.navigator-suite-header {
+ font-size: 22px;
+ margin: 0 10px 5px 0;
+ background-color: #deb887;
+ text-align: center;
+}
+
+.collapse-all-icon {
+ padding: 5px;
+ float: right;
+}
+/*retro Theme*/
diff --git a/opensaml-spring/test-output/testng-reports.js b/opensaml-spring/test-output/testng-reports.js
new file mode 100644
index 000000000..c1a84a35d
--- /dev/null
+++ b/opensaml-spring/test-output/testng-reports.js
@@ -0,0 +1,122 @@
+$(document).ready(function() {
+ $('a.navigator-link').on("click", function() {
+ // Extract the panel for this link
+ var panel = getPanelName($(this));
+
+ // Mark this link as currently selected
+ $('.navigator-link').parent().removeClass('navigator-selected');
+ $(this).parent().addClass('navigator-selected');
+
+ showPanel(panel);
+ });
+
+ installMethodHandlers('failed');
+ installMethodHandlers('skipped');
+ installMethodHandlers('passed', true); // hide passed methods by default
+
+ $('a.method').on("click", function() {
+ showMethod($(this));
+ return false;
+ });
+
+ // Hide all the panels and display the first one (do this last
+ // to make sure the click() will invoke the listeners)
+ $('.panel').hide();
+ $('.navigator-link').first().trigger("click");
+
+ // Collapse/expand the suites
+ $('a.collapse-all-link').on("click", function() {
+ var contents = $('.navigator-suite-content');
+ if (contents.css('display') == 'none') {
+ contents.show();
+ } else {
+ contents.hide();
+ }
+ });
+});
+
+// The handlers that take care of showing/hiding the methods
+function installMethodHandlers(name, hide) {
+ function getContent(t) {
+ return $('.method-list-content.' + name + "." + t.attr('panel-name'));
+ }
+
+ function getHideLink(t, name) {
+ var s = 'a.hide-methods.' + name + "." + t.attr('panel-name');
+ return $(s);
+ }
+
+ function getShowLink(t, name) {
+ return $('a.show-methods.' + name + "." + t.attr('panel-name'));
+ }
+
+ function getMethodPanelClassSel(element, name) {
+ var panelName = getPanelName(element);
+ var sel = '.' + panelName + "-class-" + name;
+ return $(sel);
+ }
+
+ $('a.hide-methods.' + name).on("click", function() {
+ var w = getContent($(this));
+ w.hide();
+ getHideLink($(this), name).hide();
+ getShowLink($(this), name).show();
+ getMethodPanelClassSel($(this), name).hide();
+ });
+
+ $('a.show-methods.' + name).on("click", function() {
+ var w = getContent($(this));
+ w.show();
+ getHideLink($(this), name).show();
+ getShowLink($(this), name).hide();
+ showPanel(getPanelName($(this)));
+ getMethodPanelClassSel($(this), name).show();
+ });
+
+ if (hide) {
+ $('a.hide-methods.' + name).trigger("click");
+ } else {
+ $('a.show-methods.' + name).trigger("click");
+ }
+}
+
+function getHashForMethod(element) {
+ return element.attr('hash-for-method');
+}
+
+function getPanelName(element) {
+ return element.attr('panel-name');
+}
+
+function showPanel(panelName) {
+ $('.panel').hide();
+ var panel = $('.panel[panel-name="' + panelName + '"]');
+ panel.show();
+}
+
+function showMethod(element) {
+ var hashTag = getHashForMethod(element);
+ var panelName = getPanelName(element);
+ showPanel(panelName);
+ var current = document.location.href;
+ var base = current.substring(0, current.indexOf('#'))
+ document.location.href = base + '#' + hashTag;
+ var newPosition = $(document).scrollTop() - 65;
+ $(document).scrollTop(newPosition);
+}
+
+function drawTable() {
+ for (var i = 0; i < suiteTableInitFunctions.length; i++) {
+ window[suiteTableInitFunctions[i]]();
+ }
+
+ for (var k in window.suiteTableData) {
+ var v = window.suiteTableData[k];
+ var div = v.tableDiv;
+ var data = v.tableData
+ var table = new google.visualization.Table(document.getElementById(div));
+ table.draw(data, {
+ showRowNumber : false
+ });
+ }
+}
diff --git a/opensaml-spring/test-output/testng-reports1.css b/opensaml-spring/test-output/testng-reports1.css
new file mode 100644
index 000000000..570323ffb
--- /dev/null
+++ b/opensaml-spring/test-output/testng-reports1.css
@@ -0,0 +1,344 @@
+body {
+ background-color: whitesmoke;
+ margin: 0 0 5px 5px;
+}
+ul {
+ margin-top: 10px;
+ margin-left:-10px;
+}
+ li {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ padding:5px 5px;
+ }
+ a {
+ text-decoration: none;
+ color: black;
+ font-size: 14px;
+ }
+
+ a:hover {
+ color:black ;
+ text-decoration: underline;
+ }
+
+ .navigator-selected {
+ /* #ffa500; Mouse hover color after click Orange.*/
+ background:#027368
+ }
+
+ .wrapper {
+ position: absolute;
+ top: 60px;
+ bottom: 0;
+ left: 400px;
+ right: 0;
+ margin-right:9px;
+ overflow: auto;/*imortant*/
+ }
+
+ .navigator-root {
+ position: absolute;
+ top: 60px;
+ bottom: 0;
+ left: 0;
+ width: 400px;
+ overflow-y: auto;/*important*/
+ }
+
+ .suite {
+ margin: -5px 10px 10px 5px;
+ background-color: whitesmoke ;/*Colour of the left bside box*/
+ }
+
+ .suite-name {
+ font-size: 24px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;/*All TEST SUITE*/
+ color: white;
+ }
+
+ .main-panel-header {
+ padding: 5px;
+ background-color: #027368; /*afeeee*/;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ color:white;
+ font-size: 18px;
+ }
+
+ .main-panel-content {
+ padding: 5px;
+ margin-bottom: 10px;
+ background-color: #CCD0D1; /*d0ffff*/; /*Belongs to backGround of rightSide boxes*/
+ }
+
+ .rounded-window {
+ border-style: dotted;
+ border-width: 1px;/*Border of left Side box*/
+ background-color: whitesmoke;
+ border-radius: 10px;
+ }
+
+ .rounded-window-top {
+ border-top-right-radius: 10px 10px;
+ border-top-left-radius: 10px 10px;
+ border-style: solid;
+ border-width: 1px;
+ overflow: auto;/*Top of RightSide box*/
+ }
+
+ .light-rounded-window-top {
+ background-color: #027368;
+ padding-left:120px;
+ border-radius: 10px;
+
+ }
+
+ .rounded-window-bottom {
+ border-bottom-right-radius: 10px 10px;
+ border-bottom-left-radius: 10px 10px;
+ overflow: auto;/*Bottom of rightSide box*/
+ }
+
+ .method-name {
+ font-size: 14px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-weight: bold;
+ }
+
+ .method-content {
+ border-style: solid;
+ border-width: 0 0 1px 0;
+ margin-bottom: 10px;
+ padding-bottom: 5px;
+ width: 100%;
+ }
+
+ .parameters {
+ font-size: 14px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ }
+
+ .stack-trace {
+ white-space: pre;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 12px;
+ font-weight: bold;
+ margin-top: 0;
+ margin-left: 20px; /*Error Stack Trace Message*/
+ }
+
+ .testng-xml {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ }
+
+ .method-list-content {
+ margin-left: 10px;
+ }
+
+ .navigator-suite-content {
+ margin-left: 10px;
+ font: 12px 'Lucida Grande';
+ }
+
+ .suite-section-title {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ font-weight:bold;
+ background-color: #8C8887;
+ margin-left: -10px;
+ margin-top:10px;
+ padding:6px;
+ }
+
+ .suite-section-content {
+ list-style-image: url(bullet_point.png);
+ background-color: whitesmoke;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ overflow: hidden;
+ }
+
+ .top-banner-root {
+ position: absolute;
+ top: 0;
+ height: 45px;
+ left: 0;
+ right: 0;
+ padding: 5px;
+ margin: 0 0 5px 0;
+ background-color: #027368;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 18px;
+ color: #fff;
+ text-align: center;/*Belongs to the Top of Report*//*Status: - Completed*/
+ }
+
+ .top-banner-title-font {
+ font-size: 25px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ padding: 3px;
+ float: right;
+ }
+
+ .test-name {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ }
+
+ .suite-icon {
+ padding: 5px;
+ float: right;
+ height: 20px;
+ }
+
+ .test-group {
+ font: 20px 'Lucida Grande';
+ margin: 5px 5px 10px 5px;
+ border-width: 0 0 1px 0;
+ border-style: solid;
+ padding: 5px;
+ }
+
+ .test-group-name {
+ font-weight: bold;
+ }
+
+ .method-in-group {
+ font-size: 16px;
+ margin-left: 80px;
+ }
+
+ table.google-visualization-table-table {
+ width: 100%;
+ }
+
+ .reporter-method-name {
+ font-size: 14px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ }
+
+ .reporter-method-output-div {
+ padding: 5px;
+ margin: 0 0 5px 20px;
+ font-size: 12px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ border-width: 0 0 0 1px;
+ border-style: solid;
+ }
+
+ .ignored-class-div {
+ font-size: 14px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ }
+
+ .ignored-methods-div {
+ padding: 5px;
+ margin: 0 0 5px 20px;
+ font-size: 12px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ border-width: 0 0 0 1px;
+ border-style: solid;
+ }
+
+ .border-failed {
+ border-radius:2px;
+ border-style: solid;
+ border-width: 0 0 0 10px;
+ border-color: #F20505;
+ }
+
+ .border-skipped {
+ border-radius:2px;
+ border-style: solid;
+ border-width: 0 0 0 10px;
+ border-color: #F2BE22;
+ }
+
+ .border-passed {
+ border-radius:2px;
+ border-style: solid;
+ border-width: 0 0 0 10px;
+ border-color: #038C73;
+ }
+
+ .times-div {
+ text-align: center;
+ padding: 5px;
+ }
+
+ .suite-total-time {
+ font: 16px 'Lucida Grande';
+ }
+
+ .configuration-suite {
+ margin-left: 20px;
+ }
+
+ .configuration-test {
+ margin-left: 40px;
+ }
+
+ .configuration-class {
+ margin-left: 60px;
+ }
+
+ .configuration-method {
+ margin-left: 80px;
+ }
+
+ .test-method {
+ margin-left: 100px;
+ }
+
+ .chronological-class {
+ background-color: #CCD0D1;
+ border-width: 0 0 1px 1px;/*Chronological*/
+ }
+
+ .method-start {
+ float: right;
+ }
+
+ .chronological-class-name {
+ padding: 0 0 0 5px;
+ margin-top:5px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ color: #008;
+ }
+
+ .after, .before, .test-method {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ margin-top:5px;
+ }
+
+ .navigator-suite-header {
+ font-size: 18px;
+ margin: 0px 10px 10px 5px;
+ padding: 5px;
+ border-radius: 10px;
+ background-color: #027368;
+ color: white;
+ font-weight:bold;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ text-align: center; /*All Suites on top of left box*//*Status: -Completed*/
+ }
+
+ .collapse-all-icon {
+ padding: 3px;
+ float: right;
+ }
+ .button{
+ position: absolute;
+ margin-left:500px;
+ margin-top:8px;
+ background-color: white;
+ color:#027368;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-weight:bold;
+ border-color:#027368;
+ border-radius:25px;
+ cursor: pointer;
+ height:30px;
+ width:150px;
+ outline: none;
+}
+/*Author: - Akhil Gullapalli*/
\ No newline at end of file
diff --git a/opensaml-spring/test-output/testng-reports2.js b/opensaml-spring/test-output/testng-reports2.js
new file mode 100644
index 000000000..5342859fa
--- /dev/null
+++ b/opensaml-spring/test-output/testng-reports2.js
@@ -0,0 +1,76 @@
+window.onload = function () {
+ let cookies = document.cookie;
+ let cookieValue = cookies.split('=');
+ if (cookieValue[1] === 'null' || localStorage.getItem('Theme') === 'null') {
+ document.getElementById('retro').setAttribute('disabled', 'false');
+ } else if (cookieValue[1] === 'Switch Ultra Theme' ||
+ localStorage.getItem('Theme') === 'Switch Ultra Theme') {
+ document.getElementById('button').innerText = "Switch Retro Theme";
+ document.getElementById('retro').setAttribute('disabled', 'false');
+
+ } else if (cookieValue[1] === 'Switch Retro Theme' ||
+ localStorage.getItem('Theme') === 'Switch Retro Theme') {
+ if (cookieValue[1] === 'Switch Ultra Theme' ||
+ localStorage.getItem('Theme') === 'Switch Ultra Theme') {
+ document.getElementById('button').innerText = "Switch Retro Theme";
+ document.getElementById('retro').setAttribute('disabled', 'false');
+
+ document.getElementById('button').innerText = "Switch Ultra Theme";
+ document.getElementById('retro').removeAttribute('disabled');
+ document.getElementById('ultra').setAttribute('disabled', 'false');
+ localStorage.setItem('Theme', select);
+
+ } else if (select === 'Switch Ultra Theme') {
+ document.getElementById('button').innerText = "Switch Retro Theme";
+ document.getElementById('ultra').removeAttribute('disabled');
+ document.getElementById('retro').setAttribute('disabled', 'false');
+ localStorage.setItem('Theme', select);
+ }
+ } else if (cookieValue[1] === 'Switch Retro Theme' ||
+ localStorage.getItem('Theme') === 'Switch Retro Theme') {
+ document.getElementById('button').innerText = "Switch Ultra Theme";
+ document.getElementById('ultra').setAttribute('disabled', 'false');
+ }
+}
+document.getElementById('button').onclick = function () {
+ let select = document.getElementById('button').innerText;
+ if (select === 'Switch Retro Theme') {
+ let d = new Date();
+ days = 365;
+ d.setTime(+d + (days * 86400000)); //24 * 60 * 60 * 1000
+ document.cookie = "Theme =" + select + "; expires=" + d.toGMTString() + ";";
+ document.getElementById('button').innerText = "Switch Ultra Theme";
+ document.getElementById('retro').removeAttribute('disabled');
+ document.getElementById('ultra').setAttribute('disabled', 'false');
+ localStorage.setItem('Theme', select);
+
+ } else if (select === 'Switch Ultra Theme') {
+ let d = new Date();
+ days = 365;
+ d.setTime(+d + (days * 86400000)); //24 * 60 * 60 * 1000
+ document.cookie = "Theme =" + select + "; expires=" + d.toGMTString() + ";";
+ document.getElementById('button').innerText = "Switch Retro Theme";
+ document.getElementById('ultra').removeAttribute('disabled');
+ document.getElementById('retro').setAttribute('disabled', 'false');
+ localStorage.setItem('Theme', select);
+ }
+}
+//Function to mouse hovering affect.
+document.getElementById('button').onmouseover = function () {
+ document.getElementById('button').style.borderRadius = "25px";
+ document.getElementById('button').style.width = "180px";
+ document.getElementById('button').style.height = "45px";
+ document.getElementById('button').style.marginTop = "1px";
+
+}
+//Function to mouse out affect
+document.getElementById('button').onmouseout = function () {
+ document.getElementById('button').style.borderRadius = "25px";
+ document.getElementById('button').style.width = "150px";
+ document.getElementById('button').style.height = "30px";
+ document.getElementById('button').style.marginTop = "8px";
+
+}
+
+//This is the file where we handle the switching of the Themes.
+/*Author:- Akhil Gullapalli*/
diff --git a/opensaml-spring/test-output/testng-results.xml b/opensaml-spring/test-output/testng-results.xml
new file mode 100644
index 000000000..fb4b67998
--- /dev/null
+++ b/opensaml-spring/test-output/testng-results.xml
@@ -0,0 +1,703 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testng-results ignored="14" total="57" passed="43" failed="0" skipped="0">
+ <reporter-output>
+ </reporter-output>
+ <suite started-at="2022-06-08T10:36:14 EDT" name="Default suite" finished-at="2022-06-08T10:36:17 EDT" duration-ms="2631">
+ <groups>
+ </groups>
+ <test started-at="2022-06-08T10:36:14 EDT" name="Default test" finished-at="2022-06-08T10:36:17 EDT" duration-ms="2631">
+ <class name="org.opensaml.spring.credential.BasicResourceParserTest">
+ <test-method is-config="true" signature="setupDirs()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:14 EDT" name="setupDirs" finished-at="2022-06-08T10:36:14 EDT" duration-ms="23" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- setupDirs -->
+ <test-method signature="publicOnly()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:14 EDT" name="publicOnly" finished-at="2022-06-08T10:36:15 EDT" duration-ms="639" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- publicOnly -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="8" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="publicPrivate()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="publicPrivate" finished-at="2022-06-08T10:36:15 EDT" duration-ms="113" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- publicPrivate -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="2" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="secretBase64()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="secretBase64" finished-at="2022-06-08T10:36:15 EDT" duration-ms="48" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- secretBase64 -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="secretBinary()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="secretBinary" finished-at="2022-06-08T10:36:15 EDT" duration-ms="57" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- secretBinary -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="secretHex()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="secretHex" finished-at="2022-06-08T10:36:15 EDT" duration-ms="28" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- secretHex -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="2" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="wrongCert()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="wrongCert" finished-at="2022-06-08T10:36:15 EDT" duration-ms="68" status="PASS">
+ <exception class="org.springframework.beans.factory.BeanCreationException">
+ <message>
+ <![CDATA[Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification]]>
+ </message>
+ <full-stacktrace>
+ <![CDATA[org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+at org.opensaml.spring.credential.BasicResourceParserTest.wrongCert(BasicResourceParserTest.java:46)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+at org.testng.TestRunner.privateRun(TestRunner.java:808)
+at org.testng.TestRunner.run(TestRunner.java:603)
+at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+at org.testng.TestNG.runSuites(TestNG.java:1092)
+at org.testng.TestNG.run(TestNG.java:1060)
+at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:125)
+at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:1)
+at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+at java.base/java.security.Signature.verify(Signature.java:789)
+at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+... 50 more
+]]>
+ </full-stacktrace>
+ </exception> <!-- org.springframework.beans.factory.BeanCreationException -->
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- wrongCert -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="2" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.credential.BasicResourceParserTest -->
+ <class name="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest">
+ <test-method signature="mixed()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="mixed" finished-at="2022-06-08T10:36:15 EDT" duration-ms="124" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- mixed -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="3" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="multipleCert()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="multipleCert" finished-at="2022-06-08T10:36:15 EDT" duration-ms="51" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- multipleCert -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="singleCert()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="singleCert" finished-at="2022-06-08T10:36:15 EDT" duration-ms="62" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- singleCert -->
+ <test-method signature="singleKey()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="singleKey" finished-at="2022-06-08T10:36:15 EDT" duration-ms="55" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- singleKey -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="0" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="0" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest -->
+ <class name="org.opensaml.spring.trust.StaticExplicitKeyParserTest">
+ <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60]" started-at="2022-06-08T10:36:15 EDT" name="simple" finished-at="2022-06-08T10:36:15 EDT" duration-ms="65" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- simple -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.trust.StaticExplicitKeyParserTest -->
+ <class name="org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest">
+ <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5]" started-at="2022-06-08T10:36:15 EDT" name="simple" finished-at="2022-06-08T10:36:15 EDT" duration-ms="44" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- simple -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest -->
+ <class name="org.opensaml.spring.trust.PKIXValidationOptionsParserTest">
+ <test-method signature="complex()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]" started-at="2022-06-08T10:36:15 EDT" name="complex" finished-at="2022-06-08T10:36:15 EDT" duration-ms="29" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- complex -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]" started-at="2022-06-08T10:36:15 EDT" name="simple" finished-at="2022-06-08T10:36:15 EDT" duration-ms="19" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- simple -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="0" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.trust.PKIXValidationOptionsParserTest -->
+ <class name="org.opensaml.spring.trust.PKIXFilesystemParserTest">
+ <test-method signature="complex()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]" started-at="2022-06-08T10:36:15 EDT" name="complex" finished-at="2022-06-08T10:36:15 EDT" duration-ms="48" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- complex -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]" started-at="2022-06-08T10:36:16 EDT" name="simple" finished-at="2022-06-08T10:36:16 EDT" duration-ms="22" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- simple -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.trust.PKIXFilesystemParserTest -->
+ <class name="org.opensaml.spring.credential.X509FilesystemParserTest">
+ <test-method signature="certElementsKeyNames()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="certElementsKeyNames" finished-at="2022-06-08T10:36:16 EDT" duration-ms="28" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- certElementsKeyNames -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="certKeyCrl()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="certKeyCrl" finished-at="2022-06-08T10:36:16 EDT" duration-ms="45" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- certKeyCrl -->
+ <test-method signature="certOnly()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="certOnly" finished-at="2022-06-08T10:36:16 EDT" duration-ms="13" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- certOnly -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="twoCert()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="twoCert" finished-at="2022-06-08T10:36:16 EDT" duration-ms="63" status="PASS">
+ <exception class="org.springframework.beans.factory.BeanCreationException">
+ <message>
+ <![CDATA[Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded]]>
+ </message>
+ <full-stacktrace>
+ <![CDATA[org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+at org.opensaml.spring.credential.X509FilesystemParserTest.twoCert(X509FilesystemParserTest.java:53)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+at org.testng.TestRunner.privateRun(TestRunner.java:808)
+at org.testng.TestRunner.run(TestRunner.java:603)
+at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+at org.testng.TestNG.runSuites(TestNG.java:1092)
+at org.testng.TestNG.run(TestNG.java:1060)
+at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+at org.opensaml.spring.credential.BasicX509CredentialFactoryBean.getEntityCertificate(BasicX509CredentialFactoryBean.java:161)
+at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:55)
+at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+... 44 more
+]]>
+ </full-stacktrace>
+ </exception> <!-- org.springframework.beans.factory.BeanCreationException -->
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- twoCert -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="3" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="wrongCert()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="wrongCert" finished-at="2022-06-08T10:36:16 EDT" duration-ms="66" status="PASS">
+ <exception class="org.springframework.beans.factory.BeanCreationException">
+ <message>
+ <![CDATA[Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification]]>
+ </message>
+ <full-stacktrace>
+ <![CDATA[org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+at org.opensaml.spring.credential.X509FilesystemParserTest.wrongCert(X509FilesystemParserTest.java:57)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+at org.testng.TestRunner.privateRun(TestRunner.java:808)
+at org.testng.TestRunner.run(TestRunner.java:603)
+at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+at org.testng.TestNG.runSuites(TestNG.java:1092)
+at org.testng.TestNG.run(TestNG.java:1060)
+at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+... 44 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+at java.base/java.security.Signature.verify(Signature.java:789)
+at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+... 51 more
+]]>
+ </full-stacktrace>
+ </exception> <!-- org.springframework.beans.factory.BeanCreationException -->
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- wrongCert -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.credential.X509FilesystemParserTest -->
+ <class name="org.opensaml.spring.credential.X509InlineParserTest">
+ <test-method signature="certKeyCrl()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]" started-at="2022-06-08T10:36:16 EDT" name="certKeyCrl" finished-at="2022-06-08T10:36:16 EDT" duration-ms="49" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- certKeyCrl -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="certOnly()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]" started-at="2022-06-08T10:36:16 EDT" name="certOnly" finished-at="2022-06-08T10:36:16 EDT" duration-ms="27" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- certOnly -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="wrongCert()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]" started-at="2022-06-08T10:36:16 EDT" name="wrongCert" finished-at="2022-06-08T10:36:16 EDT" duration-ms="31" status="PASS">
+ <exception class="org.springframework.beans.factory.BeanCreationException">
+ <message>
+ <![CDATA[Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification]]>
+ </message>
+ <full-stacktrace>
+ <![CDATA[org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+at org.opensaml.spring.credential.X509InlineParserTest.wrongCert(X509InlineParserTest.java:48)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+at org.testng.TestRunner.privateRun(TestRunner.java:808)
+at org.testng.TestRunner.run(TestRunner.java:603)
+at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+at org.testng.TestNG.runSuites(TestNG.java:1092)
+at org.testng.TestNG.run(TestNG.java:1060)
+at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+at java.base/java.security.Signature.verify(Signature.java:789)
+at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+... 50 more
+]]>
+ </full-stacktrace>
+ </exception> <!-- org.springframework.beans.factory.BeanCreationException -->
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- wrongCert -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.credential.X509InlineParserTest -->
+ <class name="org.opensaml.spring.trust.ChainingTrustEngineTest">
+ <test-method signature="one()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]" started-at="2022-06-08T10:36:16 EDT" name="one" finished-at="2022-06-08T10:36:16 EDT" duration-ms="59" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- one -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="3" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="two()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]" started-at="2022-06-08T10:36:16 EDT" name="two" finished-at="2022-06-08T10:36:16 EDT" duration-ms="38" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- two -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="6" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.trust.ChainingTrustEngineTest -->
+ <class name="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest">
+ <test-method signature="certPath()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]" started-at="2022-06-08T10:36:16 EDT" name="certPath" finished-at="2022-06-08T10:36:16 EDT" duration-ms="67" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- certPath -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="nameCheckDisabled()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]" started-at="2022-06-08T10:36:16 EDT" name="nameCheckDisabled" finished-at="2022-06-08T10:36:16 EDT" duration-ms="36" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- nameCheckDisabled -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest -->
+ <class name="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest">
+ <test-method signature="customPropertiesFailsValidation()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]" started-at="2022-06-08T10:36:16 EDT" name="customPropertiesFailsValidation" finished-at="2022-06-08T10:36:16 EDT" duration-ms="51" status="PASS">
+ <exception class="org.springframework.beans.factory.BeanCreationException">
+ <message>
+ <![CDATA[Error creating bean with name 'StaticPKIXX509CredentialTrustEngine' defined in class path resource [org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml]: Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled]]>
+ </message>
+ <full-stacktrace>
+ <![CDATA[org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StaticPKIXX509CredentialTrustEngine' defined in class path resource [org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml]: Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:922)
+at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:926)
+at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:592)
+at org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.customPropertiesFailsValidation(StaticPKIXFactoryBeanTest.java:101)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+at org.testng.TestRunner.privateRun(TestRunner.java:808)
+at org.testng.TestRunner.run(TestRunner.java:603)
+at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+at org.testng.TestNG.runSuites(TestNG.java:1092)
+at org.testng.TestNG.run(TestNG.java:1060)
+at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled
+at org.opensaml.spring.trust.StaticPKIXFactoryBean.validateConfiguration(StaticPKIXFactoryBean.java:271)
+at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:244)
+at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:1)
+at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+... 38 more
+]]>
+ </full-stacktrace>
+ </exception> <!-- org.springframework.beans.factory.BeanCreationException -->
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- customPropertiesFailsValidation -->
+ <test-method signature="customPropertiesSuccess()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]" started-at="2022-06-08T10:36:16 EDT" name="customPropertiesSuccess" finished-at="2022-06-08T10:36:16 EDT" duration-ms="25" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- customPropertiesSuccess -->
+ <test-method signature="defaults()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]" started-at="2022-06-08T10:36:16 EDT" name="defaults" finished-at="2022-06-08T10:36:16 EDT" duration-ms="15" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- defaults -->
+ </class> <!-- org.opensaml.spring.trust.StaticPKIXFactoryBeanTest -->
+ <class name="org.opensaml.spring.trust.SignatureChainingParserTest">
+ <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b]" started-at="2022-06-08T10:36:16 EDT" name="simple" finished-at="2022-06-08T10:36:16 EDT" duration-ms="36" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- simple -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.trust.SignatureChainingParserTest -->
+ <class name="org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest">
+ <test-method signature="bean()[pri:0, instance:org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest at 29e495ff]" started-at="2022-06-08T10:36:16 EDT" name="bean" finished-at="2022-06-08T10:36:16 EDT" duration-ms="73" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- bean -->
+ </class> <!-- org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest -->
+ <class name="org.opensaml.spring.credential.BasicInlineParserTest">
+ <test-method signature="publicOnly()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="publicOnly" finished-at="2022-06-08T10:36:16 EDT" duration-ms="21" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- publicOnly -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="publicPrivate()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="publicPrivate" finished-at="2022-06-08T10:36:16 EDT" duration-ms="35" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- publicPrivate -->
+ <test-method signature="secretBase64()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="secretBase64" finished-at="2022-06-08T10:36:16 EDT" duration-ms="17" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- secretBase64 -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="2" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="secretHex()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="secretHex" finished-at="2022-06-08T10:36:16 EDT" duration-ms="15" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- secretHex -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.credential.BasicInlineParserTest -->
+ <class name="org.opensaml.spring.trust.PKIXInlineParserTest">
+ <test-method signature="complex()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]" started-at="2022-06-08T10:36:16 EDT" name="complex" finished-at="2022-06-08T10:36:16 EDT" duration-ms="21" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- complex -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="2" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]" started-at="2022-06-08T10:36:16 EDT" name="simple" finished-at="2022-06-08T10:36:16 EDT" duration-ms="21" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- simple -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.trust.PKIXInlineParserTest -->
+ <class name="org.opensaml.spring.trust.StaticPKIXSignatureParserTest">
+ <test-method signature="certPath()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:16 EDT" name="certPath" finished-at="2022-06-08T10:36:16 EDT" duration-ms="20" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- certPath -->
+ <test-method signature="nameCheckDisabled()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:16 EDT" name="nameCheckDisabled" finished-at="2022-06-08T10:36:16 EDT" duration-ms="22" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- nameCheckDisabled -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:16 EDT" name="simple" finished-at="2022-06-08T10:36:17 EDT" duration-ms="20" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- simple -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:17 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:17 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ <test-method signature="values()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:17 EDT" name="values" finished-at="2022-06-08T10:36:17 EDT" duration-ms="44" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- values -->
+ <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:17 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:17 EDT" duration-ms="1" status="PASS">
+ <reporter-output>
+ </reporter-output>
+ </test-method> <!-- tearDownTestContext -->
+ </class> <!-- org.opensaml.spring.trust.StaticPKIXSignatureParserTest -->
+ </test> <!-- Default test -->
+ </suite> <!-- Default suite -->
+</testng-results>
diff --git a/opensaml-spring/test-output/testng.css b/opensaml-spring/test-output/testng.css
new file mode 100644
index 000000000..5124ba863
--- /dev/null
+++ b/opensaml-spring/test-output/testng.css
@@ -0,0 +1,9 @@
+.invocation-failed, .test-failed { background-color: #DD0000; }
+.invocation-percent, .test-percent { background-color: #006600; }
+.invocation-passed, .test-passed { background-color: #00AA00; }
+.invocation-skipped, .test-skipped { background-color: #CCCC00; }
+
+.main-page {
+ font-size: x-large;
+}
+
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list