From 7fa237530211171a58f3dbb9b3912d79b4d26490 Mon Sep 17 00:00:00 2001 From: srosse <stephane.rosse@frentix.com> Date: Thu, 18 Jul 2019 16:01:09 +0200 Subject: [PATCH] OO-4154: write the right namespace in signature doc., convert old docs --- .../util/xml/XMLDigitalSignatureUtil.java | 80 +++++-- .../util/xml/XMLDigitalSignatureUtilTest.java | 97 ++++++++- .../core/util/xml/embeddedSignature_13x.xml | 206 ++++++++++++++++++ .../core/util/xml/embeddedSignature_14x.xml | 206 ++++++++++++++++++ .../util/xml/embeddedSignature_14x_java11.xml | 206 ++++++++++++++++++ .../org/olat/core/util/xml/signature_13x.xml | 20 ++ .../org/olat/core/util/xml/signature_14x.xml | 20 ++ .../core/util/xml/signature_14x_java11.xml | 20 ++ 8 files changed, 832 insertions(+), 23 deletions(-) create mode 100644 src/test/java/org/olat/core/util/xml/embeddedSignature_13x.xml create mode 100644 src/test/java/org/olat/core/util/xml/embeddedSignature_14x.xml create mode 100644 src/test/java/org/olat/core/util/xml/embeddedSignature_14x_java11.xml create mode 100644 src/test/java/org/olat/core/util/xml/signature_13x.xml create mode 100644 src/test/java/org/olat/core/util/xml/signature_14x.xml create mode 100644 src/test/java/org/olat/core/util/xml/signature_14x_java11.xml diff --git a/src/main/java/org/olat/core/util/xml/XMLDigitalSignatureUtil.java b/src/main/java/org/olat/core/util/xml/XMLDigitalSignatureUtil.java index 849b0071d28..1371c84c9c8 100644 --- a/src/main/java/org/olat/core/util/xml/XMLDigitalSignatureUtil.java +++ b/src/main/java/org/olat/core/util/xml/XMLDigitalSignatureUtil.java @@ -36,6 +36,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; +import javax.xml.XMLConstants; import javax.xml.crypto.AlgorithmMethod; import javax.xml.crypto.Data; import javax.xml.crypto.KeySelector; @@ -71,6 +72,7 @@ import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; @@ -109,15 +111,14 @@ public class XMLDigitalSignatureUtil { * @throws XMLSignatureException */ public static boolean validate(String uri, File xmlFile, File xmlSignatureFile, PublicKey publicKey) - throws ParserConfigurationException, SAXException, IOException, MarshalException, XMLSignatureException { - + throws ParserConfigurationException, SAXException, IOException, MarshalException, XMLSignatureException { Document doc = getDocument(xmlSignatureFile); - NodeList nl = doc.getElementsByTagName("Signature"); - if (nl.getLength() == 0) { - return false; - } + Element signatureEl = getSignatureElement(doc); + if(signatureEl == null) { + return false; + } - DOMValidateContext validContext = new DOMValidateContext(publicKey, nl.item(0)); + DOMValidateContext validContext = new DOMValidateContext(publicKey, signatureEl); validContext.setBaseURI(uri); validContext.setURIDereferencer(new FileURIDereferencer(uri, xmlFile)); @@ -215,6 +216,29 @@ public class XMLDigitalSignatureUtil { return validFlag; } + private static Element getSignatureElement(Document doc) { + NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature"); + if (nl.getLength() == 0) { + nl = doc.getElementsByTagNameNS("http://www.imsglobal.org/xsd/imsqti_result_v2p1", "Signature"); + if (nl.getLength() == 1) { + Element signatureEl = (Element)nl.item(0); + try { + signatureEl.setAttribute("xmlns", XMLSignature.XMLNS); + Document signatureDoc = createDocument(); + write(signatureEl, signatureDoc); + return signatureDoc.getDocumentElement(); + } catch (Exception e) { + log.error("", e); + } + return signatureEl; + } else { + log.warn("Signature element not found"); + return null; + } + } + return (Element)nl.item(0); + } + /** * Produce a signed a XML file. The signature is added in the XML file. * @@ -232,14 +256,14 @@ public class XMLDigitalSignatureUtil { * @throws TransformerException */ public static void signEmbedded(File xmlFile, File xmlSignedFile, X509Certificate x509Cert, PrivateKey privateKey) - throws IOException, SAXException, ParserConfigurationException, NoSuchAlgorithmException, GeneralSecurityException, MarshalException, XMLSignatureException, TransformerException { + throws IOException, SAXException, ParserConfigurationException, GeneralSecurityException, MarshalException, XMLSignatureException, TransformerException { Document doc = getDocument(xmlFile); // Create the signature factory for creating the signature. XMLSignatureFactory sigFactory = XMLSignatureFactory.getInstance("DOM"); - List<Transform> transforms = new ArrayList<Transform>(); + List<Transform> transforms = new ArrayList<>(); Transform envelopped = sigFactory.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null); transforms.add(envelopped); @@ -299,17 +323,14 @@ public class XMLDigitalSignatureUtil { */ public static void signDetached(String uri, File xmlFile, File outputSignatureFile, Document signatureDoc, String keyName, X509Certificate x509Cert, PrivateKey privateKey) - throws IOException, SAXException, ParserConfigurationException, NoSuchAlgorithmException, GeneralSecurityException, MarshalException, XMLSignatureException, TransformerException { + throws IOException, SAXException, ParserConfigurationException, GeneralSecurityException, MarshalException, XMLSignatureException, TransformerException { Document doc = getDocument(xmlFile); // Create the signature factory for creating the signature. XMLSignatureFactory sigFactory = XMLSignatureFactory.getInstance("DOM"); - List<Transform> transforms = new ArrayList<Transform>(); - - //Transform envelopped = sigFactory.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null); - //transforms.add(envelopped); + List<Transform> transforms = new ArrayList<>(); // Create the canonicalization transform to be applied after the XSLT. CanonicalizationMethod c14n = sigFactory.newCanonicalizationMethod( @@ -350,33 +371,48 @@ public class XMLDigitalSignatureUtil { DOMSignContext dsc = new DOMSignContext(privateKey, signatureInfoNode); dsc.setBaseURI(uri); dsc.setURIDereferencer(new FileURIDereferencer(uri, xmlFile)); - + // Create the signature from the signing context and key info XMLSignature signature = sigFactory.newXMLSignature(si, ki); signature.sign(dsc); NodeList nl = doc.getElementsByTagName("Signature"); if (nl.getLength() == 1) { + Element signatureEl = (Element)nl.item(0); if(signatureDoc != null && signatureDoc.getDocumentElement() != null) { Element rootEl = signatureDoc.getDocumentElement(); - rootEl.appendChild(signatureDoc.importNode(nl.item(0), true)); + rootEl.appendChild(signatureDoc.importNode(signatureEl, true)); write(rootEl, outputSignatureFile); } else { - write(nl.item(0), outputSignatureFile); + signatureDoc = createDocument(); + signatureDoc.appendChild(signatureDoc.importNode(signatureEl, true)); + write(signatureDoc, outputSignatureFile); } } } private static void write(Node node, File outputFile) - throws IOException, TransformerException, TransformerFactoryConfigurationError, IllegalArgumentException { + throws IOException, TransformerException, TransformerFactoryConfigurationError { try (Writer ssw = new FileWriter(outputFile)) { TransformerFactory tf = TransformerFactory.newInstance(); + tf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); Transformer trans = tf.newTransformer(); trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); trans.transform(new DOMSource(node), new StreamResult(ssw)); - } catch (TransformerException | TransformerFactoryConfigurationError | IllegalArgumentException e) { + } catch (TransformerException | TransformerFactoryConfigurationError | IllegalArgumentException | IOException e) { throw e; - } catch (IOException e) { + } + } + + private static void write(Node node, Document target) + throws TransformerException, TransformerFactoryConfigurationError { + try { + TransformerFactory tf = TransformerFactory.newInstance(); + tf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + Transformer trans = tf.newTransformer(); + trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + trans.transform(new DOMSource(node), new DOMResult(target)); + } catch (TransformerException | TransformerFactoryConfigurationError | IllegalArgumentException e) { throw e; } } @@ -384,13 +420,15 @@ public class XMLDigitalSignatureUtil { public static Document getDocument(File xmlFile) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); dbFactory.setNamespaceAware(true); return dbFactory.newDocumentBuilder().parse(xmlFile); } public static Document createDocument() - throws ParserConfigurationException, SAXException, IOException { + throws ParserConfigurationException { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); dbFactory.setNamespaceAware(true); return dbFactory.newDocumentBuilder().newDocument(); } diff --git a/src/test/java/org/olat/core/util/xml/XMLDigitalSignatureUtilTest.java b/src/test/java/org/olat/core/util/xml/XMLDigitalSignatureUtilTest.java index 61cdd7ac87a..24ebc9691cc 100644 --- a/src/test/java/org/olat/core/util/xml/XMLDigitalSignatureUtilTest.java +++ b/src/test/java/org/olat/core/util/xml/XMLDigitalSignatureUtilTest.java @@ -65,12 +65,11 @@ public class XMLDigitalSignatureUtilTest { URL xmlUrl = XMLDigitalSignatureUtilTest.class.getResource("assessmentResult.xml"); File xmlFile = new File(xmlUrl.toURI()); - String xmlUri = xmlUrl.toURI().toString(); + String xmlUri = xmlUrl.toURI().toString().replace("ws_sidedfeatures", "ws_14_branches"); File xmlSignatureFile = File.createTempFile("assessment-result", "_signature.xml"); XMLDigitalSignatureUtil.signDetached(xmlUri, xmlFile, xmlSignatureFile, null, null, certificateInfo.getX509Cert(), certificateInfo.getPrivateKey()); - Assert.assertTrue(xmlSignatureFile.length() > 0); boolean valid = XMLDigitalSignatureUtil.validate(xmlUri, xmlFile, xmlSignatureFile, @@ -81,6 +80,67 @@ public class XMLDigitalSignatureUtilTest { Files.deleteIfExists(xmlSignatureFile.toPath()); } + /** + * Check if we can validate a signature with the wrong namespace (http://www.imsglobal.org/xsd/imsqti_result_v2p1) + * + * @throws Exception + */ + @Test + public void validateDetached_version13x() throws Exception { + X509CertificatePrivateKeyPair certificateInfo = getCertificatePrivateKeyPair(); + + URL xmlUrl = XMLDigitalSignatureUtilTest.class.getResource("assessmentResult.xml"); + File xmlFile = new File(xmlUrl.toURI()); + + URL xmlSignatureUrl = XMLDigitalSignatureUtilTest.class.getResource("signature_13x.xml"); + File xmlSignatureFile = new File(xmlSignatureUrl.toURI()); + String xmlUri = "file:/Users/srosse/Developer/Work/ws_14_branches/OpenOLAT/target/test-classes/org/olat/core/util/xml/assessmentResult.xml"; + + boolean valid = XMLDigitalSignatureUtil.validate(xmlUri, xmlFile, xmlSignatureFile, + certificateInfo.getX509Cert().getPublicKey()); + Assert.assertTrue(valid); + } + + /** + * Check if we can validate a signature produced by OpenOlat with the right namespace + * @throws Exception + */ + @Test + public void validateDetached_version14x() throws Exception { + X509CertificatePrivateKeyPair certificateInfo = getCertificatePrivateKeyPair(); + + URL xmlUrl = XMLDigitalSignatureUtilTest.class.getResource("assessmentResult.xml"); + File xmlFile = new File(xmlUrl.toURI()); + + URL xmlSignatureUrl = XMLDigitalSignatureUtilTest.class.getResource("signature_14x.xml"); + File xmlSignatureFile = new File(xmlSignatureUrl.toURI()); + String xmlUri = "file:/Users/srosse/Developer/Work/ws_14_branches/OpenOLAT/target/test-classes/org/olat/core/util/xml/assessmentResult.xml"; + + boolean valid = XMLDigitalSignatureUtil.validate(xmlUri, xmlFile, xmlSignatureFile, + certificateInfo.getX509Cert().getPublicKey()); + Assert.assertTrue(valid); + } + + /** + * Check if we can validate a signature produced by Java 11 + * @throws Exception + */ + @Test + public void validateDetached_version14x_java11() throws Exception { + X509CertificatePrivateKeyPair certificateInfo = getCertificatePrivateKeyPair(); + + URL xmlUrl = XMLDigitalSignatureUtilTest.class.getResource("assessmentResult.xml"); + File xmlFile = new File(xmlUrl.toURI()); + + URL xmlSignatureUrl = XMLDigitalSignatureUtilTest.class.getResource("signature_14x_java11.xml"); + File xmlSignatureFile = new File(xmlSignatureUrl.toURI()); + String xmlUri = "file:/Users/srosse/Developer/Work/ws_sidedfeatures/OpenOLAT/target/test-classes/org/olat/core/util/xml/assessmentResult.xml"; + + boolean valid = XMLDigitalSignatureUtil.validate(xmlUri, xmlFile, xmlSignatureFile, + certificateInfo.getX509Cert().getPublicKey()); + Assert.assertTrue(valid); + } + @Test public void signDetachedAndValidate_exoticUri() throws Exception { X509CertificatePrivateKeyPair certificateInfo = getCertificatePrivateKeyPair(); @@ -187,6 +247,39 @@ public class XMLDigitalSignatureUtilTest { Files.deleteIfExists(xmlSignedFile.toPath()); } + @Test + public void validateEmbedded_version13x() throws Exception { + X509CertificatePrivateKeyPair certificateInfo = getCertificatePrivateKeyPair(); + URL xmlSignedUrl = XMLDigitalSignatureUtilTest.class.getResource("embeddedSignature_13x.xml"); + File xmlSignedFile = new File(xmlSignedUrl.toURI()); + + boolean valid = XMLDigitalSignatureUtil.validate(xmlSignedFile, + certificateInfo.getX509Cert().getPublicKey()); + Assert.assertTrue(valid); + } + + @Test + public void validateEmbedded_version14x() throws Exception { + X509CertificatePrivateKeyPair certificateInfo = getCertificatePrivateKeyPair(); + URL xmlSignedUrl = XMLDigitalSignatureUtilTest.class.getResource("embeddedSignature_14x.xml"); + File xmlSignedFile = new File(xmlSignedUrl.toURI()); + + boolean valid = XMLDigitalSignatureUtil.validate(xmlSignedFile, + certificateInfo.getX509Cert().getPublicKey()); + Assert.assertTrue(valid); + } + + @Test + public void validateEmbedded_version14x_java11() throws Exception { + X509CertificatePrivateKeyPair certificateInfo = getCertificatePrivateKeyPair(); + URL xmlSignedUrl = XMLDigitalSignatureUtilTest.class.getResource("embeddedSignature_14x_java11.xml"); + File xmlSignedFile = new File(xmlSignedUrl.toURI()); + + boolean valid = XMLDigitalSignatureUtil.validate(xmlSignedFile, + certificateInfo.getX509Cert().getPublicKey()); + Assert.assertTrue(valid); + } + /** * Check that the signature validate the data too by slightly changing a value in * the signed XML file. diff --git a/src/test/java/org/olat/core/util/xml/embeddedSignature_13x.xml b/src/test/java/org/olat/core/util/xml/embeddedSignature_13x.xml new file mode 100644 index 00000000000..568feb9c2cf --- /dev/null +++ b/src/test/java/org/olat/core/util/xml/embeddedSignature_13x.xml @@ -0,0 +1,206 @@ +<assessmentResult xmlns="http://www.imsglobal.org/xsd/imsqti_result_v2p1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_result_v2p1 http://www.imsglobal.org/xsd/imsqti_result_v2p1.xsd"> + <context> + <sessionIdentifier identifier="testsession/2038" sourceID="http://localhost:8081/auth/RepositoryEntry/720863232/TestSession/2038"/> + </context> + <testResult datestamp="2017-02-08T16:54:49" identifier="test7501c21c-c3db-468d-b5b8-c40339aaf323.xml"> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="boolean" cardinality="single" identifier="PASS"> + <value>true</value> + </outcomeVariable> + </testResult> + <itemResult datestamp="2017-02-08T16:54:49" identifier="sc144e214a9f4cfe90d2ecf0781c291f" sequenceIndex="1" sessionStatus="final"> + <outcomeVariable baseType="identifier" cardinality="single" identifier="completionStatus"> + <value>unknown</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="FEEDBACKBASIC" view="testConstructor"> + <value>incorrect</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="multiple" identifier="FEEDBACKMODAL" view="testConstructor"> + <value>Feedback95140378493387</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="SOLUTIONMODAL" view="testConstructor"> + <value>Feedback95140378493385</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MAXSCORE"> + <value>1.0</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="HINTFEEDBACKMODAL"/> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE" view="testConstructor"> + <value>0.0</value> + </outcomeVariable> + <responseVariable baseType="float" cardinality="single" identifier="duration"> + <candidateResponse> + <value>701.727</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="integer" cardinality="single" identifier="numAttempts"> + <candidateResponse> + <value>12</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="HINTREQUEST"> + <candidateResponse> + <value>false</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="RESPONSE_1"> + <correctResponse> + <value>sccde3ab0fdd487ea26a3f9594ebf40f</value> + </correctResponse> + <candidateResponse> + <value>sc3a3fd5e8cb4cdba7199e984202437d</value> + </candidateResponse> + </responseVariable> + </itemResult> + <itemResult datestamp="2017-02-08T16:54:49" identifier="mce58c219bae4156adf4e0e02803512f" sequenceIndex="1" sessionStatus="initial"> + <outcomeVariable baseType="identifier" cardinality="single" identifier="completionStatus"> + <value>unknown</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="FEEDBACKBASIC" view="testConstructor"> + <value>none</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="multiple" identifier="FEEDBACKMODAL" view="testConstructor"/> + <outcomeVariable baseType="identifier" cardinality="single" identifier="SOLUTIONMODAL" view="testConstructor"/> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MAXSCORE"> + <value>1.0</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="HINTFEEDBACKMODAL"/> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE" view="testConstructor"> + <value>0.0</value> + </outcomeVariable> + <responseVariable baseType="float" cardinality="single" identifier="duration"> + <candidateResponse> + <value>0.0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="integer" cardinality="single" identifier="numAttempts"> + <candidateResponse> + <value>0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="HINTREQUEST"> + <candidateResponse/> + </responseVariable> + <responseVariable baseType="identifier" cardinality="multiple" identifier="RESPONSE_1"> + <correctResponse> + <value>mca7d05a516a4d1c9dbe4963b766a517</value> + <value>mc746c767ff24f3891f93546cbe4ef51</value> + </correctResponse> + <candidateResponse/> + </responseVariable> + </itemResult> + <itemResult datestamp="2017-02-08T16:54:49" identifier="kprimeeceecc4d94b08c9d0ea6f0a9eb" sequenceIndex="1" sessionStatus="initial"> + <outcomeVariable baseType="identifier" cardinality="single" identifier="completionStatus"> + <value>unknown</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="FEEDBACKBASIC" view="testConstructor"> + <value>none</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="multiple" identifier="FEEDBACKMODAL" view="testConstructor"/> + <outcomeVariable baseType="identifier" cardinality="single" identifier="SOLUTIONMODAL" view="testConstructor"/> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MAXSCORE"> + <value>1.0</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="HINTFEEDBACKMODAL"/> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE" view="testConstructor"> + <value>0.0</value> + </outcomeVariable> + <responseVariable baseType="float" cardinality="single" identifier="duration"> + <candidateResponse> + <value>0.0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="integer" cardinality="single" identifier="numAttempts"> + <candidateResponse> + <value>0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="HINTREQUEST"> + <candidateResponse/> + </responseVariable> + <responseVariable baseType="directedPair" cardinality="multiple" identifier="KPRIM_RESPONSE_1"> + <correctResponse> + <value>d95140378493395 wrong</value> + <value>a95140378493392 wrong</value> + <value>b95140378493393 wrong</value> + <value>c95140378493394 wrong</value> + </correctResponse> + <candidateResponse/> + </responseVariable> + </itemResult> + <itemResult datestamp="2017-02-08T16:54:49" identifier="fib1e0afaf7f48bcbf2c7410df0a9062" sequenceIndex="1" sessionStatus="initial"> + <outcomeVariable baseType="identifier" cardinality="single" identifier="completionStatus"> + <value>unknown</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="FEEDBACKBASIC" view="testConstructor"> + <value>none</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="multiple" identifier="FEEDBACKMODAL" view="testConstructor"/> + <outcomeVariable baseType="identifier" cardinality="single" identifier="SOLUTIONMODAL" view="testConstructor"/> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MAXSCORE"> + <value>1.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE_RESPONSE_1"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="HINTFEEDBACKMODAL"/> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE" view="testConstructor"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE_RESPONSE_1"> + <value>0.0</value> + </outcomeVariable> + <responseVariable baseType="float" cardinality="single" identifier="duration"> + <candidateResponse> + <value>0.0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="integer" cardinality="single" identifier="numAttempts"> + <candidateResponse> + <value>0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="HINTREQUEST"> + <candidateResponse/> + </responseVariable> + <responseVariable baseType="string" cardinality="single" identifier="RESPONSE_1"> + <correctResponse> + <value>gap</value> + </correctResponse> + <candidateResponse/> + </responseVariable> + </itemResult> +<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>kZtaqo6Au6L9eiGVghQYQsR+AkKn9MXtTebsAbgx9O8=</DigestValue></Reference></SignedInfo><SignatureValue>ab5QOVZO7w0kQpPDA74ozC6YTSBXE6myZHKQcUadB77qBFk7cQMNX3B48FGtn8at1KBJsjKJndWC +kYKXmwGbKXUr+ASgo5FTwtz9Zbm4289jklUGOB1twPTw3gv/LNyHhl4bG5p/0qENcgA66NwHhJhV +4wrU7YZJqHc1R23TNngxcZMFkKjLtbWj2SK3IbFubr/mQTrNvCnxNKEANDUcH57kO7xA1+LsVMB3 +1ENuysScjf4/xcxB0AJaEHaI7wRz5RE0hpxDOLmlYmf3zRvvefFFsCc6uhC9O5AVR4dUyuutOzQy +VRf5Jylrxu/o8dXyZLcRdcVlCDZ0nE+Q/icQrw==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIDgTCCAmmgAwIBAgIJAMIi622nJ/aJMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAkNIMRQw +EgYDVQQIDAtTd2l0emVybGFuZDEPMA0GA1UEBwwGWnVyaWNoMSEwHwYDVQQKDBhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTcwMjE1MTQzMDE1WhcNMTgwMjE1MTQzMDE1WjBXMQswCQYDVQQG +EwJDSDEUMBIGA1UECAwLU3dpdHplcmxhbmQxDzANBgNVBAcMBlp1cmljaDEhMB8GA1UECgwYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvnt5 +KQo6mUvMu4Ck/CoESGY2WDXBj/MQWFtF1J2wAjNIZ0Mgx1vRQA/bhXe91C3uncazS0QotVMAjzZh +oBJFiBCqQthqaFeZYKiT1AJ0x6yuh5WHurO/dVGZqHgZLpCAC1prtuA6SJ+y1xqSSeAzrdDV7P43 +Vxpl6ZL1F3Zz3kv5u8HwThtGJl8pW3kOLpkflC/6h7CaypBKmjdcDnSp4sqf79m1KGCF1CA9nwGa +lMWcdj8ymCOEv09aXpHinhD/jn3BtvXZZDROcuEBiDRDkI8rsrSiOYEWb2B1nL+UKD7DmVqw7vMX +DEZU8yGPd2BP9K9xsnRzghYitBwO7o9b1wIDAQABo1AwTjAdBgNVHQ4EFgQUMJrItZcudUBYX+8v +CpE/GINHU4gwHwYDVR0jBBgwFoAUMJrItZcudUBYX+8vCpE/GINHU4gwDAYDVR0TBAUwAwEB/zAN +BgkqhkiG9w0BAQsFAAOCAQEAcUl/BXv93YTAk3mlPwHKKHZtjNFlSCkVQgZVcIEDEEpELtVuMEep +QW3WkKLVP06g/B8yFAoR9P3WJqzkzCWMWDrYYMIx02aGCeKQAo8ITWIfTBUUDSypVfLpDH/HRI02 +wc4zPzB6JL+uLK4ikJWC9XR1+zovFYCaeK6OPB3vDs/iufNjjsWREhvAgCTvl7JjxAub543TjhJN +u8RsSFQU6x27dgk6TvlKOKB7p/b191E0Zo2uFxAUtAlX1pvQc9JjEjLKkpQT0apRpFnBbRg97qkt +oilrK9xHukKPlz2i7WX+je62koICx2U85RwdneK9ZYivaPSk/zqpL1XFuLHG8Q==</X509Certificate></X509Data></KeyInfo></Signature></assessmentResult> \ No newline at end of file diff --git a/src/test/java/org/olat/core/util/xml/embeddedSignature_14x.xml b/src/test/java/org/olat/core/util/xml/embeddedSignature_14x.xml new file mode 100644 index 00000000000..568feb9c2cf --- /dev/null +++ b/src/test/java/org/olat/core/util/xml/embeddedSignature_14x.xml @@ -0,0 +1,206 @@ +<assessmentResult xmlns="http://www.imsglobal.org/xsd/imsqti_result_v2p1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_result_v2p1 http://www.imsglobal.org/xsd/imsqti_result_v2p1.xsd"> + <context> + <sessionIdentifier identifier="testsession/2038" sourceID="http://localhost:8081/auth/RepositoryEntry/720863232/TestSession/2038"/> + </context> + <testResult datestamp="2017-02-08T16:54:49" identifier="test7501c21c-c3db-468d-b5b8-c40339aaf323.xml"> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="boolean" cardinality="single" identifier="PASS"> + <value>true</value> + </outcomeVariable> + </testResult> + <itemResult datestamp="2017-02-08T16:54:49" identifier="sc144e214a9f4cfe90d2ecf0781c291f" sequenceIndex="1" sessionStatus="final"> + <outcomeVariable baseType="identifier" cardinality="single" identifier="completionStatus"> + <value>unknown</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="FEEDBACKBASIC" view="testConstructor"> + <value>incorrect</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="multiple" identifier="FEEDBACKMODAL" view="testConstructor"> + <value>Feedback95140378493387</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="SOLUTIONMODAL" view="testConstructor"> + <value>Feedback95140378493385</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MAXSCORE"> + <value>1.0</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="HINTFEEDBACKMODAL"/> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE" view="testConstructor"> + <value>0.0</value> + </outcomeVariable> + <responseVariable baseType="float" cardinality="single" identifier="duration"> + <candidateResponse> + <value>701.727</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="integer" cardinality="single" identifier="numAttempts"> + <candidateResponse> + <value>12</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="HINTREQUEST"> + <candidateResponse> + <value>false</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="RESPONSE_1"> + <correctResponse> + <value>sccde3ab0fdd487ea26a3f9594ebf40f</value> + </correctResponse> + <candidateResponse> + <value>sc3a3fd5e8cb4cdba7199e984202437d</value> + </candidateResponse> + </responseVariable> + </itemResult> + <itemResult datestamp="2017-02-08T16:54:49" identifier="mce58c219bae4156adf4e0e02803512f" sequenceIndex="1" sessionStatus="initial"> + <outcomeVariable baseType="identifier" cardinality="single" identifier="completionStatus"> + <value>unknown</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="FEEDBACKBASIC" view="testConstructor"> + <value>none</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="multiple" identifier="FEEDBACKMODAL" view="testConstructor"/> + <outcomeVariable baseType="identifier" cardinality="single" identifier="SOLUTIONMODAL" view="testConstructor"/> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MAXSCORE"> + <value>1.0</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="HINTFEEDBACKMODAL"/> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE" view="testConstructor"> + <value>0.0</value> + </outcomeVariable> + <responseVariable baseType="float" cardinality="single" identifier="duration"> + <candidateResponse> + <value>0.0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="integer" cardinality="single" identifier="numAttempts"> + <candidateResponse> + <value>0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="HINTREQUEST"> + <candidateResponse/> + </responseVariable> + <responseVariable baseType="identifier" cardinality="multiple" identifier="RESPONSE_1"> + <correctResponse> + <value>mca7d05a516a4d1c9dbe4963b766a517</value> + <value>mc746c767ff24f3891f93546cbe4ef51</value> + </correctResponse> + <candidateResponse/> + </responseVariable> + </itemResult> + <itemResult datestamp="2017-02-08T16:54:49" identifier="kprimeeceecc4d94b08c9d0ea6f0a9eb" sequenceIndex="1" sessionStatus="initial"> + <outcomeVariable baseType="identifier" cardinality="single" identifier="completionStatus"> + <value>unknown</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="FEEDBACKBASIC" view="testConstructor"> + <value>none</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="multiple" identifier="FEEDBACKMODAL" view="testConstructor"/> + <outcomeVariable baseType="identifier" cardinality="single" identifier="SOLUTIONMODAL" view="testConstructor"/> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MAXSCORE"> + <value>1.0</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="HINTFEEDBACKMODAL"/> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE" view="testConstructor"> + <value>0.0</value> + </outcomeVariable> + <responseVariable baseType="float" cardinality="single" identifier="duration"> + <candidateResponse> + <value>0.0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="integer" cardinality="single" identifier="numAttempts"> + <candidateResponse> + <value>0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="HINTREQUEST"> + <candidateResponse/> + </responseVariable> + <responseVariable baseType="directedPair" cardinality="multiple" identifier="KPRIM_RESPONSE_1"> + <correctResponse> + <value>d95140378493395 wrong</value> + <value>a95140378493392 wrong</value> + <value>b95140378493393 wrong</value> + <value>c95140378493394 wrong</value> + </correctResponse> + <candidateResponse/> + </responseVariable> + </itemResult> + <itemResult datestamp="2017-02-08T16:54:49" identifier="fib1e0afaf7f48bcbf2c7410df0a9062" sequenceIndex="1" sessionStatus="initial"> + <outcomeVariable baseType="identifier" cardinality="single" identifier="completionStatus"> + <value>unknown</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="FEEDBACKBASIC" view="testConstructor"> + <value>none</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="multiple" identifier="FEEDBACKMODAL" view="testConstructor"/> + <outcomeVariable baseType="identifier" cardinality="single" identifier="SOLUTIONMODAL" view="testConstructor"/> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MAXSCORE"> + <value>1.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE_RESPONSE_1"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="HINTFEEDBACKMODAL"/> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE" view="testConstructor"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE_RESPONSE_1"> + <value>0.0</value> + </outcomeVariable> + <responseVariable baseType="float" cardinality="single" identifier="duration"> + <candidateResponse> + <value>0.0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="integer" cardinality="single" identifier="numAttempts"> + <candidateResponse> + <value>0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="HINTREQUEST"> + <candidateResponse/> + </responseVariable> + <responseVariable baseType="string" cardinality="single" identifier="RESPONSE_1"> + <correctResponse> + <value>gap</value> + </correctResponse> + <candidateResponse/> + </responseVariable> + </itemResult> +<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>kZtaqo6Au6L9eiGVghQYQsR+AkKn9MXtTebsAbgx9O8=</DigestValue></Reference></SignedInfo><SignatureValue>ab5QOVZO7w0kQpPDA74ozC6YTSBXE6myZHKQcUadB77qBFk7cQMNX3B48FGtn8at1KBJsjKJndWC +kYKXmwGbKXUr+ASgo5FTwtz9Zbm4289jklUGOB1twPTw3gv/LNyHhl4bG5p/0qENcgA66NwHhJhV +4wrU7YZJqHc1R23TNngxcZMFkKjLtbWj2SK3IbFubr/mQTrNvCnxNKEANDUcH57kO7xA1+LsVMB3 +1ENuysScjf4/xcxB0AJaEHaI7wRz5RE0hpxDOLmlYmf3zRvvefFFsCc6uhC9O5AVR4dUyuutOzQy +VRf5Jylrxu/o8dXyZLcRdcVlCDZ0nE+Q/icQrw==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIDgTCCAmmgAwIBAgIJAMIi622nJ/aJMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAkNIMRQw +EgYDVQQIDAtTd2l0emVybGFuZDEPMA0GA1UEBwwGWnVyaWNoMSEwHwYDVQQKDBhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTcwMjE1MTQzMDE1WhcNMTgwMjE1MTQzMDE1WjBXMQswCQYDVQQG +EwJDSDEUMBIGA1UECAwLU3dpdHplcmxhbmQxDzANBgNVBAcMBlp1cmljaDEhMB8GA1UECgwYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvnt5 +KQo6mUvMu4Ck/CoESGY2WDXBj/MQWFtF1J2wAjNIZ0Mgx1vRQA/bhXe91C3uncazS0QotVMAjzZh +oBJFiBCqQthqaFeZYKiT1AJ0x6yuh5WHurO/dVGZqHgZLpCAC1prtuA6SJ+y1xqSSeAzrdDV7P43 +Vxpl6ZL1F3Zz3kv5u8HwThtGJl8pW3kOLpkflC/6h7CaypBKmjdcDnSp4sqf79m1KGCF1CA9nwGa +lMWcdj8ymCOEv09aXpHinhD/jn3BtvXZZDROcuEBiDRDkI8rsrSiOYEWb2B1nL+UKD7DmVqw7vMX +DEZU8yGPd2BP9K9xsnRzghYitBwO7o9b1wIDAQABo1AwTjAdBgNVHQ4EFgQUMJrItZcudUBYX+8v +CpE/GINHU4gwHwYDVR0jBBgwFoAUMJrItZcudUBYX+8vCpE/GINHU4gwDAYDVR0TBAUwAwEB/zAN +BgkqhkiG9w0BAQsFAAOCAQEAcUl/BXv93YTAk3mlPwHKKHZtjNFlSCkVQgZVcIEDEEpELtVuMEep +QW3WkKLVP06g/B8yFAoR9P3WJqzkzCWMWDrYYMIx02aGCeKQAo8ITWIfTBUUDSypVfLpDH/HRI02 +wc4zPzB6JL+uLK4ikJWC9XR1+zovFYCaeK6OPB3vDs/iufNjjsWREhvAgCTvl7JjxAub543TjhJN +u8RsSFQU6x27dgk6TvlKOKB7p/b191E0Zo2uFxAUtAlX1pvQc9JjEjLKkpQT0apRpFnBbRg97qkt +oilrK9xHukKPlz2i7WX+je62koICx2U85RwdneK9ZYivaPSk/zqpL1XFuLHG8Q==</X509Certificate></X509Data></KeyInfo></Signature></assessmentResult> \ No newline at end of file diff --git a/src/test/java/org/olat/core/util/xml/embeddedSignature_14x_java11.xml b/src/test/java/org/olat/core/util/xml/embeddedSignature_14x_java11.xml new file mode 100644 index 00000000000..4f4d2d76a8e --- /dev/null +++ b/src/test/java/org/olat/core/util/xml/embeddedSignature_14x_java11.xml @@ -0,0 +1,206 @@ +<assessmentResult xmlns="http://www.imsglobal.org/xsd/imsqti_result_v2p1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_result_v2p1 http://www.imsglobal.org/xsd/imsqti_result_v2p1.xsd"> + <context> + <sessionIdentifier identifier="testsession/2038" sourceID="http://localhost:8081/auth/RepositoryEntry/720863232/TestSession/2038"/> + </context> + <testResult datestamp="2017-02-08T16:54:49" identifier="test7501c21c-c3db-468d-b5b8-c40339aaf323.xml"> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="boolean" cardinality="single" identifier="PASS"> + <value>true</value> + </outcomeVariable> + </testResult> + <itemResult datestamp="2017-02-08T16:54:49" identifier="sc144e214a9f4cfe90d2ecf0781c291f" sequenceIndex="1" sessionStatus="final"> + <outcomeVariable baseType="identifier" cardinality="single" identifier="completionStatus"> + <value>unknown</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="FEEDBACKBASIC" view="testConstructor"> + <value>incorrect</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="multiple" identifier="FEEDBACKMODAL" view="testConstructor"> + <value>Feedback95140378493387</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="SOLUTIONMODAL" view="testConstructor"> + <value>Feedback95140378493385</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MAXSCORE"> + <value>1.0</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="HINTFEEDBACKMODAL"/> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE" view="testConstructor"> + <value>0.0</value> + </outcomeVariable> + <responseVariable baseType="float" cardinality="single" identifier="duration"> + <candidateResponse> + <value>701.727</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="integer" cardinality="single" identifier="numAttempts"> + <candidateResponse> + <value>12</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="HINTREQUEST"> + <candidateResponse> + <value>false</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="RESPONSE_1"> + <correctResponse> + <value>sccde3ab0fdd487ea26a3f9594ebf40f</value> + </correctResponse> + <candidateResponse> + <value>sc3a3fd5e8cb4cdba7199e984202437d</value> + </candidateResponse> + </responseVariable> + </itemResult> + <itemResult datestamp="2017-02-08T16:54:49" identifier="mce58c219bae4156adf4e0e02803512f" sequenceIndex="1" sessionStatus="initial"> + <outcomeVariable baseType="identifier" cardinality="single" identifier="completionStatus"> + <value>unknown</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="FEEDBACKBASIC" view="testConstructor"> + <value>none</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="multiple" identifier="FEEDBACKMODAL" view="testConstructor"/> + <outcomeVariable baseType="identifier" cardinality="single" identifier="SOLUTIONMODAL" view="testConstructor"/> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MAXSCORE"> + <value>1.0</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="HINTFEEDBACKMODAL"/> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE" view="testConstructor"> + <value>0.0</value> + </outcomeVariable> + <responseVariable baseType="float" cardinality="single" identifier="duration"> + <candidateResponse> + <value>0.0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="integer" cardinality="single" identifier="numAttempts"> + <candidateResponse> + <value>0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="HINTREQUEST"> + <candidateResponse/> + </responseVariable> + <responseVariable baseType="identifier" cardinality="multiple" identifier="RESPONSE_1"> + <correctResponse> + <value>mca7d05a516a4d1c9dbe4963b766a517</value> + <value>mc746c767ff24f3891f93546cbe4ef51</value> + </correctResponse> + <candidateResponse/> + </responseVariable> + </itemResult> + <itemResult datestamp="2017-02-08T16:54:49" identifier="kprimeeceecc4d94b08c9d0ea6f0a9eb" sequenceIndex="1" sessionStatus="initial"> + <outcomeVariable baseType="identifier" cardinality="single" identifier="completionStatus"> + <value>unknown</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="FEEDBACKBASIC" view="testConstructor"> + <value>none</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="multiple" identifier="FEEDBACKMODAL" view="testConstructor"/> + <outcomeVariable baseType="identifier" cardinality="single" identifier="SOLUTIONMODAL" view="testConstructor"/> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MAXSCORE"> + <value>1.0</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="HINTFEEDBACKMODAL"/> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE" view="testConstructor"> + <value>0.0</value> + </outcomeVariable> + <responseVariable baseType="float" cardinality="single" identifier="duration"> + <candidateResponse> + <value>0.0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="integer" cardinality="single" identifier="numAttempts"> + <candidateResponse> + <value>0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="HINTREQUEST"> + <candidateResponse/> + </responseVariable> + <responseVariable baseType="directedPair" cardinality="multiple" identifier="KPRIM_RESPONSE_1"> + <correctResponse> + <value>d95140378493395 wrong</value> + <value>a95140378493392 wrong</value> + <value>b95140378493393 wrong</value> + <value>c95140378493394 wrong</value> + </correctResponse> + <candidateResponse/> + </responseVariable> + </itemResult> + <itemResult datestamp="2017-02-08T16:54:49" identifier="fib1e0afaf7f48bcbf2c7410df0a9062" sequenceIndex="1" sessionStatus="initial"> + <outcomeVariable baseType="identifier" cardinality="single" identifier="completionStatus"> + <value>unknown</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="FEEDBACKBASIC" view="testConstructor"> + <value>none</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="multiple" identifier="FEEDBACKMODAL" view="testConstructor"/> + <outcomeVariable baseType="identifier" cardinality="single" identifier="SOLUTIONMODAL" view="testConstructor"/> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MAXSCORE"> + <value>1.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE_RESPONSE_1"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="identifier" cardinality="single" identifier="HINTFEEDBACKMODAL"/> + <outcomeVariable baseType="float" cardinality="single" identifier="MINSCORE" view="testConstructor"> + <value>0.0</value> + </outcomeVariable> + <outcomeVariable baseType="float" cardinality="single" identifier="SCORE_RESPONSE_1"> + <value>0.0</value> + </outcomeVariable> + <responseVariable baseType="float" cardinality="single" identifier="duration"> + <candidateResponse> + <value>0.0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="integer" cardinality="single" identifier="numAttempts"> + <candidateResponse> + <value>0</value> + </candidateResponse> + </responseVariable> + <responseVariable baseType="identifier" cardinality="single" identifier="HINTREQUEST"> + <candidateResponse/> + </responseVariable> + <responseVariable baseType="string" cardinality="single" identifier="RESPONSE_1"> + <correctResponse> + <value>gap</value> + </correctResponse> + <candidateResponse/> + </responseVariable> + </itemResult> +<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>kZtaqo6Au6L9eiGVghQYQsR+AkKn9MXtTebsAbgx9O8=</DigestValue></Reference></SignedInfo><SignatureValue>ab5QOVZO7w0kQpPDA74ozC6YTSBXE6myZHKQcUadB77qBFk7cQMNX3B48FGtn8at1KBJsjKJndWC
 +kYKXmwGbKXUr+ASgo5FTwtz9Zbm4289jklUGOB1twPTw3gv/LNyHhl4bG5p/0qENcgA66NwHhJhV
 +4wrU7YZJqHc1R23TNngxcZMFkKjLtbWj2SK3IbFubr/mQTrNvCnxNKEANDUcH57kO7xA1+LsVMB3
 +1ENuysScjf4/xcxB0AJaEHaI7wRz5RE0hpxDOLmlYmf3zRvvefFFsCc6uhC9O5AVR4dUyuutOzQy
 +VRf5Jylrxu/o8dXyZLcRdcVlCDZ0nE+Q/icQrw==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIDgTCCAmmgAwIBAgIJAMIi622nJ/aJMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAkNIMRQw
 +EgYDVQQIDAtTd2l0emVybGFuZDEPMA0GA1UEBwwGWnVyaWNoMSEwHwYDVQQKDBhJbnRlcm5ldCBX
 +aWRnaXRzIFB0eSBMdGQwHhcNMTcwMjE1MTQzMDE1WhcNMTgwMjE1MTQzMDE1WjBXMQswCQYDVQQG
 +EwJDSDEUMBIGA1UECAwLU3dpdHplcmxhbmQxDzANBgNVBAcMBlp1cmljaDEhMB8GA1UECgwYSW50
 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvnt5
 +KQo6mUvMu4Ck/CoESGY2WDXBj/MQWFtF1J2wAjNIZ0Mgx1vRQA/bhXe91C3uncazS0QotVMAjzZh
 +oBJFiBCqQthqaFeZYKiT1AJ0x6yuh5WHurO/dVGZqHgZLpCAC1prtuA6SJ+y1xqSSeAzrdDV7P43
 +Vxpl6ZL1F3Zz3kv5u8HwThtGJl8pW3kOLpkflC/6h7CaypBKmjdcDnSp4sqf79m1KGCF1CA9nwGa
 +lMWcdj8ymCOEv09aXpHinhD/jn3BtvXZZDROcuEBiDRDkI8rsrSiOYEWb2B1nL+UKD7DmVqw7vMX
 +DEZU8yGPd2BP9K9xsnRzghYitBwO7o9b1wIDAQABo1AwTjAdBgNVHQ4EFgQUMJrItZcudUBYX+8v
 +CpE/GINHU4gwHwYDVR0jBBgwFoAUMJrItZcudUBYX+8vCpE/GINHU4gwDAYDVR0TBAUwAwEB/zAN
 +BgkqhkiG9w0BAQsFAAOCAQEAcUl/BXv93YTAk3mlPwHKKHZtjNFlSCkVQgZVcIEDEEpELtVuMEep
 +QW3WkKLVP06g/B8yFAoR9P3WJqzkzCWMWDrYYMIx02aGCeKQAo8ITWIfTBUUDSypVfLpDH/HRI02
 +wc4zPzB6JL+uLK4ikJWC9XR1+zovFYCaeK6OPB3vDs/iufNjjsWREhvAgCTvl7JjxAub543TjhJN
 +u8RsSFQU6x27dgk6TvlKOKB7p/b191E0Zo2uFxAUtAlX1pvQc9JjEjLKkpQT0apRpFnBbRg97qkt
 +oilrK9xHukKPlz2i7WX+je62koICx2U85RwdneK9ZYivaPSk/zqpL1XFuLHG8Q==</X509Certificate></X509Data></KeyInfo></Signature></assessmentResult> \ No newline at end of file diff --git a/src/test/java/org/olat/core/util/xml/signature_13x.xml b/src/test/java/org/olat/core/util/xml/signature_13x.xml new file mode 100644 index 00000000000..bf6a800af9a --- /dev/null +++ b/src/test/java/org/olat/core/util/xml/signature_13x.xml @@ -0,0 +1,20 @@ +<Signature xmlns="http://www.imsglobal.org/xsd/imsqti_result_v2p1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI="file:/Users/srosse/Developer/Work/ws_14_branches/OpenOLAT/target/test-classes/org/olat/core/util/xml/assessmentResult.xml"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>kZtaqo6Au6L9eiGVghQYQsR+AkKn9MXtTebsAbgx9O8=</DigestValue></Reference></SignedInfo><SignatureValue xmlns="http://www.w3.org/2000/09/xmldsig#">OWeeoNiI/0nxtOWBlJyJk+NpPxbA3jOGgzs9E/rmBkxY/98h3oAkz0GEbx+uwjPJQW7YigkVA6t8 +kbEQIlsDp6H3vHvBqiApQg0LDXNmjPmawZNrWx6V5360jMKC5qZF/NNVIywJbdAfJ6Y0oVZFujEO +oL/UrnY21wCZbwa4lW2ij6SlpUw921r/to9WO2PtI/++x5wcP41BjoLvv3gQmF5iV3dvKYIaXbPr +QeruoglVnPbg+3WmB6UE7v6Sf9lKX0Mh2DHTs534STPc6OCljfGvk4dLZo6QIZMt9YOn4mJRnYj3 +FfUIAUuFeSWnacEoeN/S2zw6CCFnlFgzOUZgQw==</SignatureValue><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><X509Data><X509Certificate>MIIDgTCCAmmgAwIBAgIJAMIi622nJ/aJMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAkNIMRQw +EgYDVQQIDAtTd2l0emVybGFuZDEPMA0GA1UEBwwGWnVyaWNoMSEwHwYDVQQKDBhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTcwMjE1MTQzMDE1WhcNMTgwMjE1MTQzMDE1WjBXMQswCQYDVQQG +EwJDSDEUMBIGA1UECAwLU3dpdHplcmxhbmQxDzANBgNVBAcMBlp1cmljaDEhMB8GA1UECgwYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvnt5 +KQo6mUvMu4Ck/CoESGY2WDXBj/MQWFtF1J2wAjNIZ0Mgx1vRQA/bhXe91C3uncazS0QotVMAjzZh +oBJFiBCqQthqaFeZYKiT1AJ0x6yuh5WHurO/dVGZqHgZLpCAC1prtuA6SJ+y1xqSSeAzrdDV7P43 +Vxpl6ZL1F3Zz3kv5u8HwThtGJl8pW3kOLpkflC/6h7CaypBKmjdcDnSp4sqf79m1KGCF1CA9nwGa +lMWcdj8ymCOEv09aXpHinhD/jn3BtvXZZDROcuEBiDRDkI8rsrSiOYEWb2B1nL+UKD7DmVqw7vMX +DEZU8yGPd2BP9K9xsnRzghYitBwO7o9b1wIDAQABo1AwTjAdBgNVHQ4EFgQUMJrItZcudUBYX+8v +CpE/GINHU4gwHwYDVR0jBBgwFoAUMJrItZcudUBYX+8vCpE/GINHU4gwDAYDVR0TBAUwAwEB/zAN +BgkqhkiG9w0BAQsFAAOCAQEAcUl/BXv93YTAk3mlPwHKKHZtjNFlSCkVQgZVcIEDEEpELtVuMEep +QW3WkKLVP06g/B8yFAoR9P3WJqzkzCWMWDrYYMIx02aGCeKQAo8ITWIfTBUUDSypVfLpDH/HRI02 +wc4zPzB6JL+uLK4ikJWC9XR1+zovFYCaeK6OPB3vDs/iufNjjsWREhvAgCTvl7JjxAub543TjhJN +u8RsSFQU6x27dgk6TvlKOKB7p/b191E0Zo2uFxAUtAlX1pvQc9JjEjLKkpQT0apRpFnBbRg97qkt +oilrK9xHukKPlz2i7WX+je62koICx2U85RwdneK9ZYivaPSk/zqpL1XFuLHG8Q==</X509Certificate></X509Data></KeyInfo></Signature> \ No newline at end of file diff --git a/src/test/java/org/olat/core/util/xml/signature_14x.xml b/src/test/java/org/olat/core/util/xml/signature_14x.xml new file mode 100644 index 00000000000..c28e1ab5a5d --- /dev/null +++ b/src/test/java/org/olat/core/util/xml/signature_14x.xml @@ -0,0 +1,20 @@ +<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI="file:/Users/srosse/Developer/Work/ws_14_branches/OpenOLAT/target/test-classes/org/olat/core/util/xml/assessmentResult.xml"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>kZtaqo6Au6L9eiGVghQYQsR+AkKn9MXtTebsAbgx9O8=</DigestValue></Reference></SignedInfo><SignatureValue>OWeeoNiI/0nxtOWBlJyJk+NpPxbA3jOGgzs9E/rmBkxY/98h3oAkz0GEbx+uwjPJQW7YigkVA6t8 +kbEQIlsDp6H3vHvBqiApQg0LDXNmjPmawZNrWx6V5360jMKC5qZF/NNVIywJbdAfJ6Y0oVZFujEO +oL/UrnY21wCZbwa4lW2ij6SlpUw921r/to9WO2PtI/++x5wcP41BjoLvv3gQmF5iV3dvKYIaXbPr +QeruoglVnPbg+3WmB6UE7v6Sf9lKX0Mh2DHTs534STPc6OCljfGvk4dLZo6QIZMt9YOn4mJRnYj3 +FfUIAUuFeSWnacEoeN/S2zw6CCFnlFgzOUZgQw==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIDgTCCAmmgAwIBAgIJAMIi622nJ/aJMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAkNIMRQw +EgYDVQQIDAtTd2l0emVybGFuZDEPMA0GA1UEBwwGWnVyaWNoMSEwHwYDVQQKDBhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTcwMjE1MTQzMDE1WhcNMTgwMjE1MTQzMDE1WjBXMQswCQYDVQQG +EwJDSDEUMBIGA1UECAwLU3dpdHplcmxhbmQxDzANBgNVBAcMBlp1cmljaDEhMB8GA1UECgwYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvnt5 +KQo6mUvMu4Ck/CoESGY2WDXBj/MQWFtF1J2wAjNIZ0Mgx1vRQA/bhXe91C3uncazS0QotVMAjzZh +oBJFiBCqQthqaFeZYKiT1AJ0x6yuh5WHurO/dVGZqHgZLpCAC1prtuA6SJ+y1xqSSeAzrdDV7P43 +Vxpl6ZL1F3Zz3kv5u8HwThtGJl8pW3kOLpkflC/6h7CaypBKmjdcDnSp4sqf79m1KGCF1CA9nwGa +lMWcdj8ymCOEv09aXpHinhD/jn3BtvXZZDROcuEBiDRDkI8rsrSiOYEWb2B1nL+UKD7DmVqw7vMX +DEZU8yGPd2BP9K9xsnRzghYitBwO7o9b1wIDAQABo1AwTjAdBgNVHQ4EFgQUMJrItZcudUBYX+8v +CpE/GINHU4gwHwYDVR0jBBgwFoAUMJrItZcudUBYX+8vCpE/GINHU4gwDAYDVR0TBAUwAwEB/zAN +BgkqhkiG9w0BAQsFAAOCAQEAcUl/BXv93YTAk3mlPwHKKHZtjNFlSCkVQgZVcIEDEEpELtVuMEep +QW3WkKLVP06g/B8yFAoR9P3WJqzkzCWMWDrYYMIx02aGCeKQAo8ITWIfTBUUDSypVfLpDH/HRI02 +wc4zPzB6JL+uLK4ikJWC9XR1+zovFYCaeK6OPB3vDs/iufNjjsWREhvAgCTvl7JjxAub543TjhJN +u8RsSFQU6x27dgk6TvlKOKB7p/b191E0Zo2uFxAUtAlX1pvQc9JjEjLKkpQT0apRpFnBbRg97qkt +oilrK9xHukKPlz2i7WX+je62koICx2U85RwdneK9ZYivaPSk/zqpL1XFuLHG8Q==</X509Certificate></X509Data></KeyInfo></Signature> \ No newline at end of file diff --git a/src/test/java/org/olat/core/util/xml/signature_14x_java11.xml b/src/test/java/org/olat/core/util/xml/signature_14x_java11.xml new file mode 100644 index 00000000000..addee03dd52 --- /dev/null +++ b/src/test/java/org/olat/core/util/xml/signature_14x_java11.xml @@ -0,0 +1,20 @@ +<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI="file:/Users/srosse/Developer/Work/ws_sidedfeatures/OpenOLAT/target/test-classes/org/olat/core/util/xml/assessmentResult.xml"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>kZtaqo6Au6L9eiGVghQYQsR+AkKn9MXtTebsAbgx9O8=</DigestValue></Reference></SignedInfo><SignatureValue>DKoHj/Xl62ti/3o6LomZkJNgAjzTtU6xW9UN8Whj3CqNtA3gaKtGrjIDLDDktAnVQeSGCFxP6vvX
 +IwMPr5Ecu56kXRDiviiSCx/6HJXXZVN5wZ4vrI212OFAljBNp2KuxcEFKhY/jJFGew91Gd5tj+9t
 +EO6pOybxV0T/I1623RjifUiJHHvFSRTQ7kGo4ZjmZ+2TMCS1eJz7giXHY7o6HSOOUtWURiF3nODU
 +Xka4/c/MgN+LA2sbDl4XcHNmebvfC2c6KlfC1bKvynvAMLSVuvHoCOKdTLLhhPuSIG0v783ukhXO
 +7b7xZkiFSy/MLvR/KPh7spELXPwUKd8cxRd4bQ==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIDgTCCAmmgAwIBAgIJAMIi622nJ/aJMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAkNIMRQw
 +EgYDVQQIDAtTd2l0emVybGFuZDEPMA0GA1UEBwwGWnVyaWNoMSEwHwYDVQQKDBhJbnRlcm5ldCBX
 +aWRnaXRzIFB0eSBMdGQwHhcNMTcwMjE1MTQzMDE1WhcNMTgwMjE1MTQzMDE1WjBXMQswCQYDVQQG
 +EwJDSDEUMBIGA1UECAwLU3dpdHplcmxhbmQxDzANBgNVBAcMBlp1cmljaDEhMB8GA1UECgwYSW50
 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvnt5
 +KQo6mUvMu4Ck/CoESGY2WDXBj/MQWFtF1J2wAjNIZ0Mgx1vRQA/bhXe91C3uncazS0QotVMAjzZh
 +oBJFiBCqQthqaFeZYKiT1AJ0x6yuh5WHurO/dVGZqHgZLpCAC1prtuA6SJ+y1xqSSeAzrdDV7P43
 +Vxpl6ZL1F3Zz3kv5u8HwThtGJl8pW3kOLpkflC/6h7CaypBKmjdcDnSp4sqf79m1KGCF1CA9nwGa
 +lMWcdj8ymCOEv09aXpHinhD/jn3BtvXZZDROcuEBiDRDkI8rsrSiOYEWb2B1nL+UKD7DmVqw7vMX
 +DEZU8yGPd2BP9K9xsnRzghYitBwO7o9b1wIDAQABo1AwTjAdBgNVHQ4EFgQUMJrItZcudUBYX+8v
 +CpE/GINHU4gwHwYDVR0jBBgwFoAUMJrItZcudUBYX+8vCpE/GINHU4gwDAYDVR0TBAUwAwEB/zAN
 +BgkqhkiG9w0BAQsFAAOCAQEAcUl/BXv93YTAk3mlPwHKKHZtjNFlSCkVQgZVcIEDEEpELtVuMEep
 +QW3WkKLVP06g/B8yFAoR9P3WJqzkzCWMWDrYYMIx02aGCeKQAo8ITWIfTBUUDSypVfLpDH/HRI02
 +wc4zPzB6JL+uLK4ikJWC9XR1+zovFYCaeK6OPB3vDs/iufNjjsWREhvAgCTvl7JjxAub543TjhJN
 +u8RsSFQU6x27dgk6TvlKOKB7p/b191E0Zo2uFxAUtAlX1pvQc9JjEjLKkpQT0apRpFnBbRg97qkt
 +oilrK9xHukKPlz2i7WX+je62koICx2U85RwdneK9ZYivaPSk/zqpL1XFuLHG8Q==</X509Certificate></X509Data></KeyInfo></Signature> \ No newline at end of file -- GitLab