[java-plugin-shibd] 02/02: Bug fixes, sealer flow tests.
Scott Cantor
cantor.2 at osu.edu
Wed Jul 3 17:53:52 UTC 2024
This is an automated email from the git hooks/post-receive script.
scantor pushed a commit to branch main
in repository java-plugin-shibd.
View the commit online:
http://git.shibboleth.net/view/?p=java-plugin-shibd.git;a=commit;h=166e45c594c9eb1453d716c40c49c8cf1574950f
commit 166e45c594c9eb1453d716c40c49c8cf1574950f
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed Jul 3 13:53:47 2024 -0400
Bug fixes, sealer flow tests.
---
.../idp/flows/sp/sealer/sealer-beans.xml | 2 +-
.../idp/flows/sp/storage/storage-beans.xml | 2 +-
.../shibboleth/sp/flows/AbstractSPFlowTest.java | 34 ++--
.../java/net/shibboleth/sp/flows/PingFlowTest.java | 23 +--
.../net/shibboleth/sp/flows/SealerFlowTest.java | 189 +++++++++++++++++++++
...SPEnvironmentApplicationContextInitializer.java | 2 +
.../idp/module/credentials/sp/sp-encryption.crt | 22 +++
.../idp/module/credentials/sp/sp-encryption.key | 27 +++
.../idp/module/credentials/sp/sp-signing.crt | 22 +++
.../idp/module/credentials/sp/sp-signing.key | 27 +++
10 files changed, 317 insertions(+), 33 deletions(-)
diff --git a/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/sealer/sealer-beans.xml b/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/sealer/sealer-beans.xml
index 3474331..38f3087 100644
--- a/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/sealer/sealer-beans.xml
+++ b/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/sealer/sealer-beans.xml
@@ -11,7 +11,7 @@
<bean id="shibboleth.sp.loggingId" class="java.lang.String" c:_0="%{idp.service.logging.sp:SPAgent}" />
<bean id="DoSealerOperation"
- class="net.shibboleth.sp.config.impl.DoSealerOperation" scope="prototype"
+ class="net.shibboleth.sp.profile.impl.DoSealerOperation" scope="prototype"
p:httpServletRequestSupplier-ref="shibboleth.HttpServletRequestSupplier"
p:dataSealer-ref="#{'%{sp.dataSealer:shibboleth.DataSealer}'.trim()}" />
diff --git a/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/storage/storage-beans.xml b/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/storage/storage-beans.xml
index 7dc672e..e9cec31 100644
--- a/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/storage/storage-beans.xml
+++ b/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/storage/storage-beans.xml
@@ -11,7 +11,7 @@
<bean id="shibboleth.sp.loggingId" class="java.lang.String" c:_0="%{idp.service.logging.sp:SPAgent}" />
<bean id="DoStorageOperation"
- class="net.shibboleth.sp.config.impl.DoStorageOperation" scope="prototype"
+ class="net.shibboleth.sp.profile.impl.DoStorageOperation" scope="prototype"
p:httpServletRequestSupplier-ref="shibboleth.HttpServletRequestSupplier"
p:storageService-ref="#{'%{sp.storageService:shibboleth.StorageService}'.trim()}" />
diff --git a/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/AbstractSPFlowTest.java b/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/AbstractSPFlowTest.java
index 56c7e96..6419ed3 100644
--- a/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/AbstractSPFlowTest.java
+++ b/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/AbstractSPFlowTest.java
@@ -15,8 +15,10 @@
package net.shibboleth.sp.flows;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.charset.Charset;
import java.util.Map;
import javax.annotation.Nonnull;
@@ -36,7 +38,6 @@ import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import net.shibboleth.idp.test.flows.AbstractFlowTest;
-import net.shibboleth.shared.security.DataSealer;
import net.shibboleth.shared.servlet.impl.HttpServletRequestResponseContext;
import net.shibboleth.sp.context.AgentRequestContext;
import net.shibboleth.sp.ddf.DDF;
@@ -59,15 +60,14 @@ public abstract class AbstractSPFlowTest extends AbstractFlowTest {
/** Event member of output.. */
@Nonnull public static final String EVENT_MEMBER_NAME = "event";
+
+ /** Test agent ID. */
+ @Nonnull public static final String AGENT_ID = "testsp.example.org";
protected String flowId;
protected String endStateId;
- @Autowired
- @Qualifier("shibboleth.DataSealer")
- private DataSealer dataSealer;
-
@Autowired
@Qualifier("shibboleth.StorageService")
StorageService storageService;
@@ -103,11 +103,6 @@ public abstract class AbstractSPFlowTest extends AbstractFlowTest {
@BeforeMethod public void initializeThreadLocals() {
HttpServletRequestResponseContext.loadCurrent(request, response);
}
-
- @Nonnull protected DataSealer getDataSealer() {
- assert dataSealer != null;
- return dataSealer;
- }
protected void setJsonRequest(final String method, final String body) {
setRequest(method, body, "application/json");
@@ -129,7 +124,14 @@ public abstract class AbstractSPFlowTest extends AbstractFlowTest {
}
protected void setDefaultAuth() {
- setBasicAuth("testsp.example.org", "foo");
+ setBasicAuth(AGENT_ID, "foo");
+ }
+
+ protected void setRequest(final String method, final DDF body, final String contentType) throws IOException {
+ try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+ body.serialize(out);
+ setRequest(request, method, out.toString(Charset.forName("UTF-8")) , contentType);
+ }
}
protected void setRequest(final String method, final String body, final String contentType) {
@@ -139,7 +141,7 @@ public abstract class AbstractSPFlowTest extends AbstractFlowTest {
protected static void setRequest(final MockHttpServletRequest request, final String method, final String body, final String contentType) {
request.setMethod(method);
request.setContentType(contentType);
- request.setContent(body.getBytes());
+ request.setContent(body.getBytes());
}
/**
@@ -150,11 +152,8 @@ public abstract class AbstractSPFlowTest extends AbstractFlowTest {
* @param eventId value to check for
*
* @return output object
- *
- * @throws IOException on error
*/
- @Nullable protected DDF assertOutputMessageEvent(@Nonnull final FlowExecutionResult result, @Nullable final String eventId)
- throws IOException {
+ @Nullable protected DDF assertOutputMessageEvent(@Nonnull final FlowExecutionResult result, @Nullable final String eventId) {
final ProfileRequestContext prc = retrieveProfileRequestContext(result);
final AgentRequestContext arc = prc.ensureSubcontext(AgentRequestContext.class);
final DDF output = arc.getOutput();
@@ -177,6 +176,9 @@ public abstract class AbstractSPFlowTest extends AbstractFlowTest {
Assert.assertTrue(!body.isstruct() || body.getmember(EVENT_MEMBER_NAME).isnull());
}
return body;
+ } catch (final IOException e) {
+ Assert.fail("DDF deserialization threw", e);
+ return null;
}
}
diff --git a/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/PingFlowTest.java b/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/PingFlowTest.java
index a06314d..01fbc3c 100644
--- a/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/PingFlowTest.java
+++ b/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/PingFlowTest.java
@@ -14,9 +14,10 @@
package net.shibboleth.sp.flows;
-import java.io.IOException;
import java.time.Instant;
+import javax.annotation.Nonnull;
+
import org.springframework.webflow.executor.FlowExecutionResult;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -25,12 +26,12 @@ import net.shibboleth.idp.authn.AuthnEventIds;
import net.shibboleth.sp.ddf.DDF;
/**
- * Unit test for the OP discovery flow.
+ * Unit test for the SP ping flow and some basic agent authentication checks.
*/
public class PingFlowTest extends AbstractSPFlowTest {
/** Flow ID. */
- public static final String FLOW_ID = "sp/ping";
+ @Nonnull public static final String FLOW_ID = "sp/ping";
protected PingFlowTest() {
super(FLOW_ID);
@@ -38,11 +39,9 @@ public class PingFlowTest extends AbstractSPFlowTest {
/**
* Test flow without authentication.
- *
- * @throws IOException
*/
@Test
- public void testUnauhenticated() throws IOException {
+ public void testUnauhenticated() {
final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
assertFlowExecutionResult(result, FLOW_ID);
assertFlowExecutionOutcome(result.getOutcome());
@@ -51,11 +50,9 @@ public class PingFlowTest extends AbstractSPFlowTest {
/**
* Test flow with invalid agent ID.
- *
- * @throws IOException
*/
@Test
- public void testInvalidAgent() throws IOException {
+ public void testInvalidAgent() {
setBasicAuth("foo", "foo");
final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
assertFlowExecutionResult(result, FLOW_ID);
@@ -65,11 +62,9 @@ public class PingFlowTest extends AbstractSPFlowTest {
/**
* Test flow with invalid agent secret.
- *
- * @throws IOException
*/
@Test
- public void testInvalidSecret() throws IOException {
+ public void testInvalidSecret() {
setBasicAuth("testsp.example.org", "bar");
final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
assertFlowExecutionResult(result, FLOW_ID);
@@ -79,11 +74,9 @@ public class PingFlowTest extends AbstractSPFlowTest {
/**
* Test flow success.
- *
- * @throws IOException
*/
@Test
- public void testSuccess() throws IOException {
+ public void testSuccess() {
setDefaultAuth();
final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
assertFlowExecutionResult(result, FLOW_ID);
diff --git a/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/SealerFlowTest.java b/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/SealerFlowTest.java
new file mode 100644
index 0000000..633f2fb
--- /dev/null
+++ b/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/SealerFlowTest.java
@@ -0,0 +1,189 @@
+/*
+ * Licensed 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 net.shibboleth.sp.flows;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import javax.annotation.Nonnull;
+
+import org.opensaml.profile.action.EventIds;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.webflow.executor.FlowExecutionResult;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import net.shibboleth.shared.security.DataExpiredException;
+import net.shibboleth.shared.security.DataSealer;
+import net.shibboleth.shared.security.DataSealerException;
+import net.shibboleth.sp.ddf.DDF;
+import net.shibboleth.sp.profile.impl.DoSealerOperation;
+
+/**
+ * Unit test for the SP sealer flow.
+ */
+public class SealerFlowTest extends AbstractSPFlowTest {
+
+ /** Flow ID. */
+ @Nonnull public static final String FLOW_ID = "sp/sealer";
+
+ /** Test data. */
+ @Nonnull public static final String TEST_VALUE = "testValue";
+
+ @Autowired
+ @Qualifier("shibboleth.DataSealer")
+ private DataSealer dataSealer;
+
+ protected SealerFlowTest() {
+ super(FLOW_ID);
+ }
+
+ @Nonnull protected DataSealer getDataSealer() {
+ assert dataSealer != null;
+ return dataSealer;
+ }
+
+ /**
+ * Test wrap operation with no input.
+ */
+ @Test
+ public void testWrapNoInput() {
+ setDefaultAuth();
+ request.setMethod("POST");
+ final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+ assertFlowExecutionResult(result, FLOW_ID);
+ assertFlowExecutionOutcome(result.getOutcome());
+ assertOutputMessageEvent(result, EventIds.INVALID_MESSAGE);
+ }
+
+ /**
+ * Test wrap operation with pre-expired data.
+ *
+ * @throws IOException
+ * @throws DataSealerException
+ */
+ @Test
+ public void testWrapExpired() throws IOException, DataSealerException {
+ setDefaultAuth();
+
+ final DDF input = new DDF().structure();
+ input.addmember(DoSealerOperation.VALUE).string(TEST_VALUE);
+ input.addmember(DoSealerOperation.EXP).longinteger(Instant.now().minusSeconds(3600).toEpochMilli() / 1000);
+ setRequest("POST", input, "text/plain");
+
+ final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+ assertFlowExecutionResult(result, FLOW_ID);
+ assertFlowExecutionOutcome(result.getOutcome());
+ final DDF obj = assertOutputMessageEvent(result, null);
+ assert obj != null;
+
+ final String wrapped = obj.getmember("value").string();
+ assert wrapped != null;
+ try {
+ dataSealer.unwrap(wrapped);
+ Assert.fail("Exception should have been raised");
+ } catch (DataExpiredException e) {
+ // expected
+ }
+ }
+
+ /**
+ * Test wrap operation success.
+ *
+ * @throws IOException
+ * @throws DataSealerException
+ */
+ @Test
+ public void testWrapSuccess() throws IOException, DataSealerException {
+ setDefaultAuth();
+
+ final DDF input = new DDF().structure();
+ input.addmember(DoSealerOperation.VALUE).string(TEST_VALUE);
+ setRequest("POST", input, "text/plain");
+
+ final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+ assertFlowExecutionResult(result, FLOW_ID);
+ assertFlowExecutionOutcome(result.getOutcome());
+ final DDF obj = assertOutputMessageEvent(result, null);
+ assert obj != null;
+
+ final String wrapped = obj.getmember("value").string();
+ assert wrapped != null;
+ Assert.assertEquals(dataSealer.unwrap(wrapped), AGENT_ID + '!' + TEST_VALUE);
+ }
+
+ /**
+ * Test unwrap operation with no input.
+ */
+ @Test
+ public void testUnwrapNoInput() {
+ setDefaultAuth();
+ request.setMethod("GET");
+ final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+ assertFlowExecutionResult(result, FLOW_ID);
+ assertFlowExecutionOutcome(result.getOutcome());
+ assertOutputMessageEvent(result, EventIds.INVALID_MESSAGE);
+ }
+
+ /**
+ * Test unwrap operation with pre-expired data.
+ *
+ * @throws IOException
+ * @throws DataSealerException
+ */
+ @Test
+ public void testUnrrapExpired() throws IOException, DataSealerException {
+ setDefaultAuth();
+
+ final String wrapped = dataSealer.wrap(AGENT_ID + '!' + TEST_VALUE, Instant.now().minusSeconds(3600));
+
+ final DDF input = new DDF().structure();
+ input.addmember(DoSealerOperation.VALUE).string(wrapped);
+ setRequest("GET", input, "text/plain");
+
+ final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+ assertFlowExecutionResult(result, FLOW_ID);
+ assertFlowExecutionOutcome(result.getOutcome());
+ assertOutputMessageEvent(result, EventIds.MESSAGE_EXPIRED);
+ }
+
+ /**
+ * Test unwrap operation success.
+ *
+ * @throws IOException
+ * @throws DataSealerException
+ */
+ @Test
+ public void testUnwrapSuccess() throws IOException, DataSealerException {
+ setDefaultAuth();
+
+ final String wrapped = dataSealer.wrap(AGENT_ID + '!' + TEST_VALUE, Instant.now().plusSeconds(3600));
+
+ final DDF input = new DDF().structure();
+ input.addmember(DoSealerOperation.VALUE).string(wrapped);
+ setRequest("GET", input, "text/plain");
+
+ final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
+ assertFlowExecutionResult(result, FLOW_ID);
+ assertFlowExecutionOutcome(result.getOutcome());
+ final DDF obj = assertOutputMessageEvent(result, null);
+ assert obj != null;
+
+ final String unwrapped = obj.getmember("value").string();
+ Assert.assertEquals(unwrapped, TEST_VALUE);
+ }
+
+}
\ No newline at end of file
diff --git a/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/TestSPEnvironmentApplicationContextInitializer.java b/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/TestSPEnvironmentApplicationContextInitializer.java
index 133dab1..8c88e67 100644
--- a/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/TestSPEnvironmentApplicationContextInitializer.java
+++ b/sp-conf-impl/src/test/java/net/shibboleth/sp/flows/TestSPEnvironmentApplicationContextInitializer.java
@@ -45,6 +45,8 @@ public class TestSPEnvironmentApplicationContextInitializer
mock.setProperty("idp.webflows", "classpath*:/flows");
mock.setProperty("idp.service.metadata.resources", "testbed.MetadataResolverResources");
mock.setProperty("sp.service.agents.resources", "test.sp.AgentResolverResources");
+ mock.setProperty("idp.additionalProperties",
+ "/conf/ldap.properties, /conf/saml-nameid.properties, /conf/services.properties, /conf/admin/admin.properties, /conf/authn/authn.properties, /conf/c14n/subject-c14n.properties, /credentials/secrets.properties, /conf/sp/sp.properties");
applicationContext.getEnvironment().getPropertySources().addFirst(mock);
log.info("Prepending properties '{}'", mock.getSource());
}
diff --git a/sp-conf-impl/src/test/resources/net/shibboleth/idp/module/credentials/sp/sp-encryption.crt b/sp-conf-impl/src/test/resources/net/shibboleth/idp/module/credentials/sp/sp-encryption.crt
new file mode 100644
index 0000000..c0df65b
--- /dev/null
+++ b/sp-conf-impl/src/test/resources/net/shibboleth/idp/module/credentials/sp/sp-encryption.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/sp-conf-impl/src/test/resources/net/shibboleth/idp/module/credentials/sp/sp-encryption.key b/sp-conf-impl/src/test/resources/net/shibboleth/idp/module/credentials/sp/sp-encryption.key
new file mode 100644
index 0000000..951462f
--- /dev/null
+++ b/sp-conf-impl/src/test/resources/net/shibboleth/idp/module/credentials/sp/sp-encryption.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/sp-conf-impl/src/test/resources/net/shibboleth/idp/module/credentials/sp/sp-signing.crt b/sp-conf-impl/src/test/resources/net/shibboleth/idp/module/credentials/sp/sp-signing.crt
new file mode 100644
index 0000000..c0df65b
--- /dev/null
+++ b/sp-conf-impl/src/test/resources/net/shibboleth/idp/module/credentials/sp/sp-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/sp-conf-impl/src/test/resources/net/shibboleth/idp/module/credentials/sp/sp-signing.key b/sp-conf-impl/src/test/resources/net/shibboleth/idp/module/credentials/sp/sp-signing.key
new file mode 100644
index 0000000..951462f
--- /dev/null
+++ b/sp-conf-impl/src/test/resources/net/shibboleth/idp/module/credentials/sp/sp-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-----
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list