[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