[xmlsectool] branch main updated: XSTJ-69 - Update to latest Santuario, tweak resulting output

Ian Young ian at iay.org.uk
Tue Oct 27 10:10:07 UTC 2020


This is an automated email from the git hooks/post-receive script.

iay pushed a commit to branch main
in repository xmlsectool.

View the commit online:
http://git.shibboleth.net/view/?p=xmlsectool.git;a=commit;h=713b50865cc4a5df1d7a205f066eb28ca5223a41

The following commit(s) were added to refs/heads/main by this push:
       new  713b508   XSTJ-69 - Update to latest Santuario, tweak resulting output
713b508 is described below

commit 713b50865cc4a5df1d7a205f066eb28ca5223a41
Author: Ian Young <ian at iay.org.uk>
AuthorDate: Tue Oct 27 10:09:58 2020 +0000

    XSTJ-69 - Update to latest Santuario, tweak resulting output
    
    https://issues.shibboleth.net/jira/browse/XSTJ-69
---
 pom.xml                                            |   1 -
 .../tool/xmlsectool/SignatureHelper.java           | 110 +++++++++++++++
 .../net/shibboleth/tool/xmlsectool/XMLSecTool.java |   1 +
 .../net/shibboleth/tool/xmlsectool/BaseTest.java   |  42 +++++-
 .../net/shibboleth/tool/xmlsectool/XSTJ59Test.java |   2 +-
 .../net/shibboleth/tool/xmlsectool/XSTJ69Test.java | 154 +++++++++++++++++++++
 .../net/shibboleth/tool/xmlsectool/XSTJ69-in.xml   | 119 ++++++++++++++++
 .../net/shibboleth/tool/xmlsectool/XSTJ69-out.xml  | 149 ++++++++++++++++++++
 .../xmlsectool/{XSTJ59-dsa1024.crt => dsa1024.crt} |   0
 .../xmlsectool/{XSTJ59-dsa1024.key => dsa1024.key} |   0
 .../net/shibboleth/tool/xmlsectool/rsasign2k.crt   |  22 +++
 .../net/shibboleth/tool/xmlsectool/rsasign2k.key   |  28 ++++
 12 files changed, 623 insertions(+), 5 deletions(-)

diff --git a/pom.xml b/pom.xml
index 30818e7..4ac95a7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,6 @@
         <opensaml.groupId>org.opensaml</opensaml.groupId>
         <opensaml.version>4.0.1</opensaml.version>
         <java-support.version>8.0.0</java-support.version>
-        <xmlsec.version>2.0.6</xmlsec.version>
     </properties>
 
     <repositories>
diff --git a/src/main/java/net/shibboleth/tool/xmlsectool/SignatureHelper.java b/src/main/java/net/shibboleth/tool/xmlsectool/SignatureHelper.java
new file mode 100644
index 0000000..f30457c
--- /dev/null
+++ b/src/main/java/net/shibboleth/tool/xmlsectool/SignatureHelper.java
@@ -0,0 +1,110 @@
+/*
+ * 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 net.shibboleth.tool.xmlsectool;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.xml.crypto.dsig.XMLSignature;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Classes to assist with signature operations.
+ */
+public final class SignatureHelper {
+
+    /** Elements which should be examined for CRs, and stripped of them. */
+    private static final List<String> STRIP_CR_ELEMENTS = List.of(
+            // Generic signatures
+            "SignatureValue", "X509Certificate",
+            // RSAKeyValue
+            "Modulus",
+            // DSAKeyValue
+            "P", "Q", "G", "Y", "J"
+        );
+
+    /** Elements which should be forced into a NL - value - NL format. */
+    private static final List<String> ENSURE_NL_ELEMENTS = List.of(
+            // RSAKeyValue
+            "Modulus",
+            // DSAKeyValue
+            "P", "G", "Y"
+        );
+
+    /**
+     * Constructor.
+     */
+    private SignatureHelper() {
+    }
+
+    /**
+     * Remove any CRs from the text content of named child elements.
+     *
+     * @param signature The <code>Signature</code> element to process.
+     * @param elementName The element name within the XML DSIG namespace to look for.
+     */
+    private static void removeCRsFromNamedChildren(@Nonnull final Element signature,
+            @Nonnull final String elementName) {
+        final NodeList nodes = signature.getElementsByTagNameNS(XMLSignature.XMLNS, elementName);
+        for (int i = 0; i < nodes.getLength(); i++) {
+            final Node node = nodes.item(i);
+            final String text = node.getTextContent();
+            if (text.indexOf('\r') >= 0) {
+                node.setTextContent(text.replaceAll("\\r", ""));
+            }
+        }
+    }
+
+    /**
+     * Ensure a named child element is in a NL - value - NL format.
+     *
+     * @param signature The <code>Signature</code> element to process.
+     * @param elementName The element name within the XML DSIG namespace to look for.
+     */
+    private static void ensureNLsWrapNamedChildren(@Nonnull final Element signature,
+            @Nonnull final String elementName) {
+        final NodeList nodes = signature.getElementsByTagNameNS(XMLSignature.XMLNS, elementName);
+        for (int i = 0; i < nodes.getLength(); i++) {
+            final Node node = nodes.item(i);
+            final String text = node.getTextContent();
+            final String newText = "\n" + text.strip() + "\n";
+            if (!newText.equals(text)) {
+                node.setTextContent(newText);
+            }
+        }
+    }
+
+    /**
+     * Post-process a generated signature.
+     *
+     * @param signatureElement DOM {@link Element} containing the signature
+     */
+    public static void postProcessSignature(@Nonnull final Element signatureElement) {
+        for (final var name : STRIP_CR_ELEMENTS) {
+            removeCRsFromNamedChildren(signatureElement, name);
+        }
+
+        for (final var name : ENSURE_NL_ELEMENTS) {
+            ensureNLsWrapNamedChildren(signatureElement, name);
+        }
+    }
+
+}
diff --git a/src/main/java/net/shibboleth/tool/xmlsectool/XMLSecTool.java b/src/main/java/net/shibboleth/tool/xmlsectool/XMLSecTool.java
index 63b4422..114a09f 100644
--- a/src/main/java/net/shibboleth/tool/xmlsectool/XMLSecTool.java
+++ b/src/main/java/net/shibboleth/tool/xmlsectool/XMLSecTool.java
@@ -411,6 +411,7 @@ public final class XMLSecTool {
 
             addSignatureELement(cli, documentRoot, signatureElement);
             signature.sign(CredentialSupport.extractSigningKey(signingCredential));
+            SignatureHelper.postProcessSignature(signatureElement);
             log.info("XML document successfully signed");
         } catch (final XMLSecurityException e) {
             log.error("Unable to create XML document signature", e);
diff --git a/src/test/java/net/shibboleth/tool/xmlsectool/BaseTest.java b/src/test/java/net/shibboleth/tool/xmlsectool/BaseTest.java
index fb60141..344c2e3 100644
--- a/src/test/java/net/shibboleth/tool/xmlsectool/BaseTest.java
+++ b/src/test/java/net/shibboleth/tool/xmlsectool/BaseTest.java
@@ -131,7 +131,7 @@ public abstract class BaseTest {
         try {
             return new File(url.toURI());
         } catch (URISyntaxException e) {
-            throw new MissingResourceException(which, testingClass.getName(), "can't locate package-relative file");
+            throw new MissingResourceException(which, testingClass.getName(), "can't locate class-relative file");
         }
     }
 
@@ -316,11 +316,11 @@ public abstract class BaseTest {
         final File keyFile = classRelativeFile(which + ".key");
         return CredentialHelper.getFileBasedCredentials(keyFile.toString(), null, certFile.toString());
     }
-    
+
     /**
      * Acquire a class-local signing credential consisting of a certificate and key.
      * 
-     * Checks that the returned credential has an appropriate public key algorithm and class.
+     * <p>Checks that the returned credential has an appropriate public key algorithm and class.</p>
      * 
      * @param which name of the credential to acquire
      * @param algorithm required public key algorithm
@@ -337,4 +337,40 @@ public abstract class BaseTest {
         Assert.assertTrue(clazz.isInstance(pk));
         return cred;
     }
+
+    /**
+     * Acquire a package-local signing credential consisting of a certificate and key.
+     * 
+     * @param which name of the credential to acquire
+     * @return the credential
+     * @throws KeyException if the key cannot be acquired
+     * @throws CertificateException if the certificate cannot be acquired
+     */
+    protected X509Credential getPackageSigningCredential(final String which) throws KeyException, CertificateException {
+        final File certFile = packageRelativeFile(which + ".crt");
+        final File keyFile = packageRelativeFile(which + ".key");
+        return CredentialHelper.getFileBasedCredentials(keyFile.toString(), null, certFile.toString());
+    }
+    
+    /**
+     * Acquire a package-local signing credential consisting of a certificate and key.
+     * 
+     * <p>Checks that the returned credential has an appropriate public key algorithm and class.</p>
+     * 
+     * @param which name of the credential to acquire
+     * @param algorithm required public key algorithm
+     * @param clazz required public key class or interface
+     * @return the credential
+     * @throws KeyException if the key cannot be acquired
+     * @throws CertificateException if the certificate cannot be acquired
+     */
+    protected X509Credential getPackageSigningCredential(final String which, final String algorithm, final Class<?> clazz)
+        throws KeyException, CertificateException {
+        final X509Credential cred = getPackageSigningCredential(which);
+        final PublicKey pk = cred.getPublicKey();
+        Assert.assertEquals(pk.getAlgorithm(), algorithm);
+        Assert.assertTrue(clazz.isInstance(pk));
+        return cred;
+    }
+
 }
diff --git a/src/test/java/net/shibboleth/tool/xmlsectool/XSTJ59Test.java b/src/test/java/net/shibboleth/tool/xmlsectool/XSTJ59Test.java
index 8e3b30f..51b6e92 100644
--- a/src/test/java/net/shibboleth/tool/xmlsectool/XSTJ59Test.java
+++ b/src/test/java/net/shibboleth/tool/xmlsectool/XSTJ59Test.java
@@ -41,7 +41,7 @@ public class XSTJ59Test extends BaseTest {
     @Test
     public void xstj59_1024_regression() throws Exception {
         // acquire a credential to sign with
-        final X509Credential cred = getSigningCredential("dsa1024", "DSA", DSAPublicKey.class);
+        final X509Credential cred = getPackageSigningCredential("dsa1024", "DSA", DSAPublicKey.class);
 
         // build command-line arguments
         final String[] args = {
diff --git a/src/test/java/net/shibboleth/tool/xmlsectool/XSTJ69Test.java b/src/test/java/net/shibboleth/tool/xmlsectool/XSTJ69Test.java
new file mode 100644
index 0000000..eec885c
--- /dev/null
+++ b/src/test/java/net/shibboleth/tool/xmlsectool/XSTJ69Test.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 net.shibboleth.tool.xmlsectool;
+
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+
+import org.opensaml.security.x509.X509Credential;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+/**
+ * Test that signature values are stable.
+ * 
+ * <p>In particular, they shouldn't include gash CR characters <em>in the Java
+ * string content.</em>
+ * </p>
+ * 
+ * @see <a href="https://issues.shibboleth.net/jira/browse/XSTJ-69">XSTJ-69</a>
+ */
+public class XSTJ69Test extends BaseTest {
+
+    XSTJ69Test() {
+        super(XSTJ69Test.class);
+    }
+    
+    /** Character value we are looking for. */
+    private static final char CR = '\r';
+    
+    /**
+     * Look at a DOM tree and collect a list of the places it contains CRs.
+     *
+     * @param badNodes a {@link List} collecting the bad nodes, initially empty
+     * @param element a DOM element to start from
+     */
+    private static void checkNoCRs(@Nonnull final List<Node> badNodes, @Nonnull final Element element) {
+        // Check all text node children of the element
+        for (Node node = element.getFirstChild(); node != null; node = node.getNextSibling()) {
+            /*
+             * There are three kinds of child node capable of including character data. We only need to
+             * check TEXT_NODEs: CDATA sections and comments can't include CR characters, as
+             * character references are not interpreted in either context.
+             */
+            if (node.getNodeType() == Node.TEXT_NODE && node.getNodeValue().indexOf(CR) >= 0) {
+                badNodes.add(element);
+            }
+            
+            /*
+             * If it's an element, recurse.
+             */
+            if (node.getNodeType() == Node.ELEMENT_NODE) {
+                checkNoCRs(badNodes, (Element)node);
+            }
+        }
+
+        // Also check any attributes on the element
+        final NamedNodeMap attributes = element.getAttributes();
+        for (int index=0; index<attributes.getLength(); index++) {
+            final Node attribute = attributes.item(index);
+            if (attribute.getNodeValue().indexOf(CR) >= 0) {
+                badNodes.add(attribute);
+            }
+        }
+
+    }
+
+    private Document testSigningWith(@Nonnull final X509Credential cred,
+            @Nonnull final CommandLineArguments cli) throws Exception {
+        // acquire a document to sign
+        final Document xml = readXMLDocument("in.xml");
+        
+        // perform signature operation
+        XMLSecTool.sign(cli, cred, xml);
+        
+        // verify the signature using our own code for consistency
+        XMLSecTool.verifySignature(cli, cred, xml);
+
+        // Look at individual elements of the signature and validate that they do NOT
+        // include CR characters. These shouldn't appear within Java strings, only in
+        // the serialized output and only on Windows. If they appear as literal CRs in
+        // this environment, they will appear in the output file as encoded CRs
+        // (
 or &#xD; or similar). Some processors of SAML metadata will balk
+        // if they see these.
+        final var badNodes = new ArrayList<Node>();
+        checkNoCRs(badNodes, xml.getDocumentElement());
+        if (!badNodes.isEmpty()) {
+            var result = badNodes.stream()
+                    .map(Node::getNodeName)
+                    .collect(Collectors.joining(", "));
+            Assert.fail("CRs appear within: " + result);
+        }
+
+        return xml;
+    }
+
+    @Test
+    public void xstj69() throws Exception {
+        // acquire credentials to sign with
+        final var rsaCredential = getPackageSigningCredential("rsasign2k", "RSA", RSAPublicKey.class);
+
+        // build command-line arguments
+        final String[] args = {
+                "--sign",
+                "--inFile", "in.xml",
+                "--outFile", "out.xml",
+                "--certificate", "sign.crt",
+                "--key", "sign.key"
+                };
+        final var cli = new CommandLineArguments();
+        cli.parseCommandLineArguments(args);
+        XMLSecTool.initLogging(cli);
+
+        // Detailed tests on the more common RSA signatures
+        final var rsaDocument = testSigningWith(rsaCredential, cli);
+        // compare with output from V2.x
+        final Document out = readXMLDocument("out.xml");
+        zapSignatureValues(rsaDocument);
+        zapSignatureValues(out);
+        assertXMLIdentical(out.getDocumentElement(), rsaDocument.getDocumentElement());
+        
+        // Superficial test with EC signature
+        final var ecCredential = getPackageSigningCredential("ecsign384", "EC", ECPublicKey.class);
+        testSigningWith(ecCredential, cli);
+
+        // Superficial test with DSA signature
+        final var dsaCredential = getPackageSigningCredential("dsa1024", "DSA", DSAPublicKey.class);
+        testSigningWith(dsaCredential, cli);
+    }
+}
diff --git a/src/test/resources/net/shibboleth/tool/xmlsectool/XSTJ69-in.xml b/src/test/resources/net/shibboleth/tool/xmlsectool/XSTJ69-in.xml
new file mode 100644
index 0000000..cd3c3f0
--- /dev/null
+++ b/src/test/resources/net/shibboleth/tool/xmlsectool/XSTJ69-in.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
+    xmlns:ukfedlabel="http://ukfederation.org.uk/2006/11/label"
+    xmlns:shibmd="urn:mace:shibboleth:metadata:1.0" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="urn:oasis:names:tc:SAML:2.0:metadata ../xml/saml-schema-metadata-2.0.xsd
+    urn:oasis:names:tc:SAML:metadata:algsupport ../xml/sstc-saml-metadata-algsupport-v1.0.xsd
+    urn:oasis:names:tc:SAML:metadata:ui ../xml/sstc-saml-metadata-ui-v1.0.xsd
+    urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol ../xml/sstc-saml-idp-discovery.xsd
+    urn:oasis:names:tc:SAML:profiles:SSO:request-init ../xml/sstc-request-initiation.xsd
+    urn:mace:shibboleth:metadata:1.0 ../xml/shibboleth-metadata-1.0.xsd
+    http://ukfederation.org.uk/2006/11/label ../xml/uk-fed-label.xsd
+    http://www.w3.org/2001/04/xmlenc# ../xml/xenc-schema.xsd
+    http://www.w3.org/2000/09/xmldsig# ../xml/xmldsig-core-schema.xsd"
+    ID="uk001480" entityID="https://idp.shibboleth.net/idp/shibboleth">
+    <!--
+        This is a shibboleth.net Shibboleth 2 IdP for the JISC Services Management Company Ltd. 
+    -->
+    <Extensions>
+        <shibmd:Scope regexp="false">shibboleth.net</shibmd:Scope>
+        <ukfedlabel:UKFederationMember/>
+        <ukfedlabel:ExportOptIn date="2011-12-07"/>
+        <ukfedlabel:Software fullVersion="2.3.8" version="2" name="Shibboleth" date="2012-12-07"/>
+        <alg:DigestMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport"
+            Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
+        <alg:DigestMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport"
+            Algorithm="http://www.w3.org/2001/04/xmldsig-more#sha384"/>
+        <alg:DigestMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport"
+            Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
+        <alg:DigestMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport"
+            Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
+        <alg:SigningMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport"
+            Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"/>
+        <alg:SigningMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport"
+            Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"/>
+        <alg:SigningMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport"
+            Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
+        <alg:SigningMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport"
+            Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
+    </Extensions>
+    <IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+        <Extensions>
+            <shibmd:Scope regexp="false">shibboleth.net</shibmd:Scope>
+            <mdui:UIInfo xmlns:mdui="urn:oasis:names:tc:SAML:metadata:ui">
+                <mdui:DisplayName xml:lang="en">Shibboleth.net</mdui:DisplayName>
+                <mdui:Description xml:lang="en">An identity provider hosted and used by the
+                    developers of Shibboleth.</mdui:Description>
+                <mdui:Logo height="82" width="64">https://shibboleth.net/images/gryphon_64x82.png</mdui:Logo>
+            </mdui:UIInfo>
+        </Extensions>
+        <KeyDescriptor>
+            <ds:KeyInfo>
+                <ds:X509Data>
+                    <ds:X509Certificate>
+                        MIIDNDCCAhygAwIBAgIVAKyBWnv1/h1U11C7kHvV33FIrEsJMA0GCSqGSIb3DQEB
+                        BQUAMB0xGzAZBgNVBAMTEmlkcC5zaGliYm9sZXRoLm5ldDAeFw0xMDEyMjkwMDA5
+                        MTlaFw0zMDEyMjkwMDA5MTlaMB0xGzAZBgNVBAMTEmlkcC5zaGliYm9sZXRoLm5l
+                        dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKjWAdpUx/82FUzrRMfA
+                        M63PkZZYCm3RnT3eiL+DeJcbGdcEJx/o+32vgHXJgJOBt14YdVam5GErIYgk4SGq
+                        5Z5RYl0PpQn6HQG/9prGnYCu6p5zfb0557o51Eh8TcVehS6Y2ruyCjAF0jgVMwh5
+                        /0Oh8EE9wG93pSpm70DAiiaTVCb8WoT1aZYtxbBmmuH10bU+wge/NMmaHuVAe599
+                        pyezFIL4FoI2g+1Q6nG4Yl1Z07I81tTApXKVMWRt/4/M3m2D7PUMOQ9qsxthp2L/
+                        LovIeNo0bTyeW290T2Y/JRZhKOgeDqkhuu82DPri2Vm5G/unB69KfRB7CF9QWIc3
+                        y80CAwEAAaNrMGkwSAYDVR0RBEEwP4ISaWRwLnNoaWJib2xldGgubmV0hilodHRw
+                        czovL2lkcC5zaGliYm9sZXRoLm5ldC9pZHAvc2hpYmJvbGV0aDAdBgNVHQ4EFgQU
+                        3uZ32tKXJBzPCTp2dtHSLV0FvGgwDQYJKoZIhvcNAQEFBQADggEBAAYXYuzp0UTj
+                        3yLRvUCbEtaw9b80+weOELkVv3WFY3QAG8pIKEblrMMtzrzLFWZwYwwMZDab/HnH
+                        egmgjZBthrOedEmoJ+OHRmIiS8zdZxVGEadJhTUaeIkO6kwK7Ht3nQePoiXV7TI5
+                        +A9SpmZGoukC85Za4wGDw4xWGs5t5l6tBuuV+1s0oC6T8ih5n/NyThfpbihSW0d7
+                        iBfSUickgpoM2BLM3FCnbO8HOsX1rGV4ypG9ZGDDvr2jrzalXXmc05gSlL2qd9ce
+                        Q1M+9vavusPCqlj2zZf2/HfzhyiFcb/OgA0oTFWW2ynXji6UarIV5QaPoi/XmGmx
+                        BXD36HfGBXk=
+                    </ds:X509Certificate>
+                </ds:X509Data>
+            </ds:KeyInfo>
+            <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
+            <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes192-cbc"/>
+            <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
+            <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/>
+            <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"/>
+        </KeyDescriptor>
+        <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat>
+        <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
+            Location="https://shibboleth.net/idp/profile/SAML2/POST/SSO"/>
+        <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"
+            Location="https://shibboleth.net/idp/profile/SAML2/POST-SimpleSign/SSO"/>
+        <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
+            Location="https://shibboleth.net/idp/profile/SAML2/Redirect/SSO"/>
+    </IDPSSODescriptor>
+    <Organization>
+        <OrganizationName xml:lang="en">JISC Services Management Company Ltd</OrganizationName>
+        <OrganizationDisplayName xml:lang="en">Shibboleth.net</OrganizationDisplayName>
+        <OrganizationURL xml:lang="en">http://www.shibboleth.net/</OrganizationURL>
+    </Organization>
+    <ContactPerson contactType="support">
+        <GivenName>Shibboleth.Net Technical Support</GivenName>
+        <EmailAddress>mailto:contact at shibboleth.net</EmailAddress>
+    </ContactPerson>
+    <ContactPerson contactType="technical">
+        <GivenName>Scott</GivenName>
+        <SurName>Cantor</SurName>
+        <EmailAddress>mailto:cantor.2 at osu.edu</EmailAddress>
+    </ContactPerson>
+    <ContactPerson contactType="technical">
+        <GivenName>Ian</GivenName>
+        <SurName>Young</SurName>
+        <EmailAddress>mailto:ukfed at iay.org.uk</EmailAddress>
+    </ContactPerson>
+    <ContactPerson contactType="administrative">
+        <GivenName>Scott</GivenName>
+        <SurName>Cantor</SurName>
+        <EmailAddress>mailto:cantor.2 at osu.edu</EmailAddress>
+    </ContactPerson>
+    <ContactPerson contactType="administrative">
+        <GivenName>Ian</GivenName>
+        <SurName>Young</SurName>
+        <EmailAddress>mailto:ian at iay.org.uk</EmailAddress>
+    </ContactPerson>
+</EntityDescriptor>
diff --git a/src/test/resources/net/shibboleth/tool/xmlsectool/XSTJ69-out.xml b/src/test/resources/net/shibboleth/tool/xmlsectool/XSTJ69-out.xml
new file mode 100644
index 0000000..1975ce9
--- /dev/null
+++ b/src/test/resources/net/shibboleth/tool/xmlsectool/XSTJ69-out.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:shibmd="urn:mace:shibboleth:metadata:1.0" xmlns:ukfedlabel="http://ukfederation.org.uk/2006/11/label" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ID="uk001480" entityID="https://idp.shibboleth.net/idp/shibboleth" xsi:schemaLocation="urn:oasis:names:tc:SAML:2.0:metadata ../xml/saml-schema-metadata-2.0.xsd     urn [...]
+<ds:SignedInfo>
+<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
+<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
+<ds:Reference URI="">
+<ds:Transforms>
+<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
+<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
+</ds:Transforms>
+<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
+<ds:DigestValue>Rr3CdVsxDDuIPwOMayyz+TsJuh2vUQKWr9n0oTFSE2k=</ds:DigestValue>
+</ds:Reference>
+</ds:SignedInfo>
+<ds:SignatureValue>
+llIZnOeVreStmfgw8eaU7ccrMsuh8s/Wo5LEOSqEyV6D67M7blmed4tSWk796iCSp/qrIPLIt2OB
+dvIundsVuJ4N9Gb66X0JPPhJp2eO/GrtDvGn7fpLD08NubEF9+v218tf/9kWSsTGH+0E7pVAzWNT
+8Q2tO2AWIKlGK3CXCYX52kf7OcTGEpe2P0op23mLK4DqRXMd12EckXgOzI7jrxEJ//9udg0NTi13
+SyC2yr+XF/UEuRq4lKqJzKTRY81jbINjMo4RshvGjK55mnEgSKIeyA66RP54RktgVeywCyArnq3Q
+rTN6xsc6sIkV0Rvoh1SoIZxpeAsx/RoxKPaPNQ==
+</ds:SignatureValue>
+<ds:KeyInfo>
+<ds:KeyValue>
+<ds:RSAKeyValue>
+<ds:Modulus>
+vl/xs6JdB26XVxqkHLa5wvUAPGO6eHjfnTNESzjtkVgs7ejKn9qQlURkRbG+LRNMcT6YxPAIEYMP
+QN6pZKNP+a8Jwxu0VWhaH4ftKqHkLsCh61ClIDLBM/88uymLkJ2s/AX398SYbuQDnGQ4z2NX9p/V
+MdkQVjMAXJG7o0tbm9QliRvGOLJ5Ne9NXnO685qqlCUEkKFtq+PKZlwMu8A/It5O7ZPL7NMVpwF3
+xFGP42eQ5H4v7aLSAS0efnpmnYkMxitRnsaWSJzbLheKhaMfFDpmkD9O+sIm1/fzcAVvwjEPqfJi
+ypioMfhnA6SkyK1A90BZK+JFFTSve7hSb4/txw==
+</ds:Modulus>
+<ds:Exponent>AQAB</ds:Exponent>
+</ds:RSAKeyValue>
+</ds:KeyValue>
+<ds:X509Data>
+<ds:X509Certificate>
+MIIDqTCCApGgAwIBAgIJAPpV7XJ2ZtjrMA0GCSqGSIb3DQEBBQUAMGsxCzAJBgNVBAYTAkdCMREw
+DwYDVQQIDAhTY290bGFuZDESMBAGA1UEBwwJRWRpbmJ1cmdoMRswGQYDVQQKDBJTaGliYm9sZXRo
+IFByb2plY3QxGDAWBgNVBAMMD1JTQSBUZXN0IFNpZ25lcjAeFw0xMzAzMDIxMDExNTFaFw0xMzA0
+MDExMDExNTFaMGsxCzAJBgNVBAYTAkdCMREwDwYDVQQIDAhTY290bGFuZDESMBAGA1UEBwwJRWRp
+bmJ1cmdoMRswGQYDVQQKDBJTaGliYm9sZXRoIFByb2plY3QxGDAWBgNVBAMMD1JTQSBUZXN0IFNp
+Z25lcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL5f8bOiXQdul1capBy2ucL1ADxj
+unh4350zREs47ZFYLO3oyp/akJVEZEWxvi0TTHE+mMTwCBGDD0DeqWSjT/mvCcMbtFVoWh+H7Sqh
+5C7AoetQpSAywTP/PLspi5CdrPwF9/fEmG7kA5xkOM9jV/af1THZEFYzAFyRu6NLW5vUJYkbxjiy
+eTXvTV5zuvOaqpQlBJChbavjymZcDLvAPyLeTu2Ty+zTFacBd8RRj+NnkOR+L+2i0gEtHn56Zp2J
+DMYrUZ7Glkic2y4XioWjHxQ6ZpA/TvrCJtf383AFb8IxD6nyYsqYqDH4ZwOkpMitQPdAWSviRRU0
+r3u4Um+P7ccCAwEAAaNQME4wHQYDVR0OBBYEFDWL9GZAVcX2dFoOVcJ1ekzVtqrwMB8GA1UdIwQY
+MBaAFDWL9GZAVcX2dFoOVcJ1ekzVtqrwMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
+AJDDx/0vuv304GxQ+G+/99Dpjlvikqrv0EJKlsX2CISlDDrM9QDt+l1z0Fo2taYQDL3tTrFKJNbs
+tEjVKT2pFv1nJcZUS97YE3lZTzhtihvuN/dByFHRRu8zinjG8zxClmGqYypDRBmGskNEJPmQPG+I
+vAJLPNP3DZpRL32qqMtSyYQJ0LpWyGsI1SjagfiNVAv1mshCoYXp89AW0VP9fKq2EUb/AWUmTX0q
+NgS5jdaGiGs1q3LOYY1CkH3i3MbuInWOWGJNF/1GLTqhZwIewcP9pDma8l9dLKb+8snSBGS0xVoV
+pR4GkCJZt7umQWgbUHTUKy1+/JGr67aSpx6jGWI=
+</ds:X509Certificate>
+</ds:X509Data>
+</ds:KeyInfo>
+</ds:Signature>
+    <!--
+        This is a shibboleth.net Shibboleth 2 IdP for the JISC Services Management Company Ltd. 
+    -->
+    <Extensions>
+        <shibmd:Scope regexp="false">shibboleth.net</shibmd:Scope>
+        <ukfedlabel:UKFederationMember/>
+        <ukfedlabel:ExportOptIn date="2011-12-07"/>
+        <ukfedlabel:Software date="2012-12-07" fullVersion="2.3.8" name="Shibboleth" version="2"/>
+        <alg:DigestMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport" Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
+        <alg:DigestMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport" Algorithm="http://www.w3.org/2001/04/xmldsig-more#sha384"/>
+        <alg:DigestMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport" Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
+        <alg:DigestMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport" Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
+        <alg:SigningMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport" Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"/>
+        <alg:SigningMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport" Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"/>
+        <alg:SigningMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport" Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
+        <alg:SigningMethod xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport" Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
+    </Extensions>
+    <IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+        <Extensions>
+            <shibmd:Scope regexp="false">shibboleth.net</shibmd:Scope>
+            <mdui:UIInfo xmlns:mdui="urn:oasis:names:tc:SAML:metadata:ui">
+                <mdui:DisplayName xml:lang="en">Shibboleth.net</mdui:DisplayName>
+                <mdui:Description xml:lang="en">An identity provider hosted and used by the
+                    developers of Shibboleth.</mdui:Description>
+                <mdui:Logo height="82" width="64">https://shibboleth.net/images/gryphon_64x82.png</mdui:Logo>
+            </mdui:UIInfo>
+        </Extensions>
+        <KeyDescriptor>
+            <ds:KeyInfo>
+                <ds:X509Data>
+                    <ds:X509Certificate>
+                        MIIDNDCCAhygAwIBAgIVAKyBWnv1/h1U11C7kHvV33FIrEsJMA0GCSqGSIb3DQEB
+                        BQUAMB0xGzAZBgNVBAMTEmlkcC5zaGliYm9sZXRoLm5ldDAeFw0xMDEyMjkwMDA5
+                        MTlaFw0zMDEyMjkwMDA5MTlaMB0xGzAZBgNVBAMTEmlkcC5zaGliYm9sZXRoLm5l
+                        dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKjWAdpUx/82FUzrRMfA
+                        M63PkZZYCm3RnT3eiL+DeJcbGdcEJx/o+32vgHXJgJOBt14YdVam5GErIYgk4SGq
+                        5Z5RYl0PpQn6HQG/9prGnYCu6p5zfb0557o51Eh8TcVehS6Y2ruyCjAF0jgVMwh5
+                        /0Oh8EE9wG93pSpm70DAiiaTVCb8WoT1aZYtxbBmmuH10bU+wge/NMmaHuVAe599
+                        pyezFIL4FoI2g+1Q6nG4Yl1Z07I81tTApXKVMWRt/4/M3m2D7PUMOQ9qsxthp2L/
+                        LovIeNo0bTyeW290T2Y/JRZhKOgeDqkhuu82DPri2Vm5G/unB69KfRB7CF9QWIc3
+                        y80CAwEAAaNrMGkwSAYDVR0RBEEwP4ISaWRwLnNoaWJib2xldGgubmV0hilodHRw
+                        czovL2lkcC5zaGliYm9sZXRoLm5ldC9pZHAvc2hpYmJvbGV0aDAdBgNVHQ4EFgQU
+                        3uZ32tKXJBzPCTp2dtHSLV0FvGgwDQYJKoZIhvcNAQEFBQADggEBAAYXYuzp0UTj
+                        3yLRvUCbEtaw9b80+weOELkVv3WFY3QAG8pIKEblrMMtzrzLFWZwYwwMZDab/HnH
+                        egmgjZBthrOedEmoJ+OHRmIiS8zdZxVGEadJhTUaeIkO6kwK7Ht3nQePoiXV7TI5
+                        +A9SpmZGoukC85Za4wGDw4xWGs5t5l6tBuuV+1s0oC6T8ih5n/NyThfpbihSW0d7
+                        iBfSUickgpoM2BLM3FCnbO8HOsX1rGV4ypG9ZGDDvr2jrzalXXmc05gSlL2qd9ce
+                        Q1M+9vavusPCqlj2zZf2/HfzhyiFcb/OgA0oTFWW2ynXji6UarIV5QaPoi/XmGmx
+                        BXD36HfGBXk=
+                    </ds:X509Certificate>
+                </ds:X509Data>
+            </ds:KeyInfo>
+            <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
+            <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes192-cbc"/>
+            <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
+            <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/>
+            <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"/>
+        </KeyDescriptor>
+        <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat>
+        <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://shibboleth.net/idp/profile/SAML2/POST/SSO"/>
+        <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" Location="https://shibboleth.net/idp/profile/SAML2/POST-SimpleSign/SSO"/>
+        <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://shibboleth.net/idp/profile/SAML2/Redirect/SSO"/>
+    </IDPSSODescriptor>
+    <Organization>
+        <OrganizationName xml:lang="en">JISC Services Management Company Ltd</OrganizationName>
+        <OrganizationDisplayName xml:lang="en">Shibboleth.net</OrganizationDisplayName>
+        <OrganizationURL xml:lang="en">http://www.shibboleth.net/</OrganizationURL>
+    </Organization>
+    <ContactPerson contactType="support">
+        <GivenName>Shibboleth.Net Technical Support</GivenName>
+        <EmailAddress>mailto:contact at shibboleth.net</EmailAddress>
+    </ContactPerson>
+    <ContactPerson contactType="technical">
+        <GivenName>Scott</GivenName>
+        <SurName>Cantor</SurName>
+        <EmailAddress>mailto:cantor.2 at osu.edu</EmailAddress>
+    </ContactPerson>
+    <ContactPerson contactType="technical">
+        <GivenName>Ian</GivenName>
+        <SurName>Young</SurName>
+        <EmailAddress>mailto:ukfed at iay.org.uk</EmailAddress>
+    </ContactPerson>
+    <ContactPerson contactType="administrative">
+        <GivenName>Scott</GivenName>
+        <SurName>Cantor</SurName>
+        <EmailAddress>mailto:cantor.2 at osu.edu</EmailAddress>
+    </ContactPerson>
+    <ContactPerson contactType="administrative">
+        <GivenName>Ian</GivenName>
+        <SurName>Young</SurName>
+        <EmailAddress>mailto:ian at iay.org.uk</EmailAddress>
+    </ContactPerson>
+</EntityDescriptor>
diff --git a/src/test/resources/net/shibboleth/tool/xmlsectool/XSTJ59-dsa1024.crt b/src/test/resources/net/shibboleth/tool/xmlsectool/dsa1024.crt
similarity index 100%
rename from src/test/resources/net/shibboleth/tool/xmlsectool/XSTJ59-dsa1024.crt
rename to src/test/resources/net/shibboleth/tool/xmlsectool/dsa1024.crt
diff --git a/src/test/resources/net/shibboleth/tool/xmlsectool/XSTJ59-dsa1024.key b/src/test/resources/net/shibboleth/tool/xmlsectool/dsa1024.key
similarity index 100%
rename from src/test/resources/net/shibboleth/tool/xmlsectool/XSTJ59-dsa1024.key
rename to src/test/resources/net/shibboleth/tool/xmlsectool/dsa1024.key
diff --git a/src/test/resources/net/shibboleth/tool/xmlsectool/rsasign2k.crt b/src/test/resources/net/shibboleth/tool/xmlsectool/rsasign2k.crt
new file mode 100644
index 0000000..070d3e1
--- /dev/null
+++ b/src/test/resources/net/shibboleth/tool/xmlsectool/rsasign2k.crt
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDqTCCApGgAwIBAgIJAPpV7XJ2ZtjrMA0GCSqGSIb3DQEBBQUAMGsxCzAJBgNV
+BAYTAkdCMREwDwYDVQQIDAhTY290bGFuZDESMBAGA1UEBwwJRWRpbmJ1cmdoMRsw
+GQYDVQQKDBJTaGliYm9sZXRoIFByb2plY3QxGDAWBgNVBAMMD1JTQSBUZXN0IFNp
+Z25lcjAeFw0xMzAzMDIxMDExNTFaFw0xMzA0MDExMDExNTFaMGsxCzAJBgNVBAYT
+AkdCMREwDwYDVQQIDAhTY290bGFuZDESMBAGA1UEBwwJRWRpbmJ1cmdoMRswGQYD
+VQQKDBJTaGliYm9sZXRoIFByb2plY3QxGDAWBgNVBAMMD1JTQSBUZXN0IFNpZ25l
+cjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL5f8bOiXQdul1capBy2
+ucL1ADxjunh4350zREs47ZFYLO3oyp/akJVEZEWxvi0TTHE+mMTwCBGDD0DeqWSj
+T/mvCcMbtFVoWh+H7Sqh5C7AoetQpSAywTP/PLspi5CdrPwF9/fEmG7kA5xkOM9j
+V/af1THZEFYzAFyRu6NLW5vUJYkbxjiyeTXvTV5zuvOaqpQlBJChbavjymZcDLvA
+PyLeTu2Ty+zTFacBd8RRj+NnkOR+L+2i0gEtHn56Zp2JDMYrUZ7Glkic2y4XioWj
+HxQ6ZpA/TvrCJtf383AFb8IxD6nyYsqYqDH4ZwOkpMitQPdAWSviRRU0r3u4Um+P
+7ccCAwEAAaNQME4wHQYDVR0OBBYEFDWL9GZAVcX2dFoOVcJ1ekzVtqrwMB8GA1Ud
+IwQYMBaAFDWL9GZAVcX2dFoOVcJ1ekzVtqrwMAwGA1UdEwQFMAMBAf8wDQYJKoZI
+hvcNAQEFBQADggEBAJDDx/0vuv304GxQ+G+/99Dpjlvikqrv0EJKlsX2CISlDDrM
+9QDt+l1z0Fo2taYQDL3tTrFKJNbstEjVKT2pFv1nJcZUS97YE3lZTzhtihvuN/dB
+yFHRRu8zinjG8zxClmGqYypDRBmGskNEJPmQPG+IvAJLPNP3DZpRL32qqMtSyYQJ
+0LpWyGsI1SjagfiNVAv1mshCoYXp89AW0VP9fKq2EUb/AWUmTX0qNgS5jdaGiGs1
+q3LOYY1CkH3i3MbuInWOWGJNF/1GLTqhZwIewcP9pDma8l9dLKb+8snSBGS0xVoV
+pR4GkCJZt7umQWgbUHTUKy1+/JGr67aSpx6jGWI=
+-----END CERTIFICATE-----
diff --git a/src/test/resources/net/shibboleth/tool/xmlsectool/rsasign2k.key b/src/test/resources/net/shibboleth/tool/xmlsectool/rsasign2k.key
new file mode 100644
index 0000000..03e8351
--- /dev/null
+++ b/src/test/resources/net/shibboleth/tool/xmlsectool/rsasign2k.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+X/Gzol0HbpdX
+GqQctrnC9QA8Y7p4eN+dM0RLOO2RWCzt6Mqf2pCVRGRFsb4tE0xxPpjE8AgRgw9A
+3qlko0/5rwnDG7RVaFofh+0qoeQuwKHrUKUgMsEz/zy7KYuQnaz8Bff3xJhu5AOc
+ZDjPY1f2n9Ux2RBWMwBckbujS1ub1CWJG8Y4snk1701ec7rzmqqUJQSQoW2r48pm
+XAy7wD8i3k7tk8vs0xWnAXfEUY/jZ5Dkfi/totIBLR5+emadiQzGK1GexpZInNsu
+F4qFox8UOmaQP076wibX9/NwBW/CMQ+p8mLKmKgx+GcDpKTIrUD3QFkr4kUVNK97
+uFJvj+3HAgMBAAECggEAO1KeeMGRh61Yj5YHqcLu4+eAqVDSXJQd6lh9YYtdzDrT
+1VcDPQjYoQrszCL1BgrLeUZuSIAbo4lZiXdZBbk2RLHcsuXBLhQUcVrj9rL37fGt
+AyzgJ8ZpGhDhFdl+WhQoQWiCurySW4vF7Ef2w/lLAdkQkDX5t0KxTCdFdz8WTtok
+65alKoB8Ap8EHc5spUSUp6UWcsm2bCkqSxHDECopz+i/ogEfS+YykxxSdrc2ZOFF
+5nk86HI8q4f3KX9tstJ659SMzo1AIZOV0cFW4gLVcHzQmY9ISI95aV/VH05MMXRF
+T5X0w7Ns5zIDPbySWvNnQMQROE+SPK+lPb4Z5mTkMQKBgQDsBUt4Th4TFns5GV35
+XRUo+RJbpXMPfnFebxihwtexVoMYD5mEIZ7bTV35+8mSiZTW+huBZX4YBP9p/gYf
+EVQnjW6G4BWrKFG++vGvg8SarCVSh6yrUWze4zln1hFGOLg1uIDe0p/9PQEYKOwY
+dFIlIagNr8UE9JGBunI6R+6XtQKBgQDOfXnmdYCi9NHiuCEIUS9QKbR98tNlJhs4
+F02rlMjW4RuqQm19juojHjWJBvZJxCDc3iL1gwO+gDHIcKCDyke6JVBzwoBMFyVi
+yG5gvoHJVdPUcuAV6XfBCdA9PX/J+C4Hpj1WnpdCZy2Uzjzllpi0o9ZlWnWExMdb
+aryo28FlCwKBgBptNVgRFxj4CXAJQRZsr7PYv493ZPy1Iah7M/zYviHjF+aXyI6c
+3RadAQq+gIFh2kJ/2piQbp/t31NU2AaegBe1pEyBxqtVZmHF403NqTPQVpV5D4JX
+KaODOahAtcpxC18oe3V3i+Zk8DxuSJEsZQ43SIPPzHWTlL87yxJvf22JAoGBAJ3p
+eXrUK37zqTswQxrAM2Wjr0OOmznEbZZ0w9JO41TpLCYFzQPzcn1O0fQr3dfF5Lfk
+LWoCOq/KC8hU0XxYCoiBlsggW8tU/CNSUo8rwcd+GpRjEZnQROPcpGLhEEQdxt3U
+tR30BIskqsgc/Jc7lya2EPTLvAnADxGLTCH6hSjHAoGBAKzmkVGzqO4PORQdww4N
+iXvD0yvNZYwX5uSsWaykaYkZxtLKe3MzfOBN0uBn14lbrDtncxXeSL+2oSElaf/H
+PRrQT6XmWVoRCWcd6L8kpkDfjVhCBV/kZ96ynjImJvDm0TDbQyGeKPfWOpjRJSUD
+gewnWbErRlkupYUyvCquj45P
+-----END PRIVATE KEY-----

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list