[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 
 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