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&#xD;
+kYKXmwGbKXUr+ASgo5FTwtz9Zbm4289jklUGOB1twPTw3gv/LNyHhl4bG5p/0qENcgA66NwHhJhV&#xD;
+4wrU7YZJqHc1R23TNngxcZMFkKjLtbWj2SK3IbFubr/mQTrNvCnxNKEANDUcH57kO7xA1+LsVMB3&#xD;
+1ENuysScjf4/xcxB0AJaEHaI7wRz5RE0hpxDOLmlYmf3zRvvefFFsCc6uhC9O5AVR4dUyuutOzQy&#xD;
+VRf5Jylrxu/o8dXyZLcRdcVlCDZ0nE+Q/icQrw==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIDgTCCAmmgAwIBAgIJAMIi622nJ/aJMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAkNIMRQw&#xD;
+EgYDVQQIDAtTd2l0emVybGFuZDEPMA0GA1UEBwwGWnVyaWNoMSEwHwYDVQQKDBhJbnRlcm5ldCBX&#xD;
+aWRnaXRzIFB0eSBMdGQwHhcNMTcwMjE1MTQzMDE1WhcNMTgwMjE1MTQzMDE1WjBXMQswCQYDVQQG&#xD;
+EwJDSDEUMBIGA1UECAwLU3dpdHplcmxhbmQxDzANBgNVBAcMBlp1cmljaDEhMB8GA1UECgwYSW50&#xD;
+ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvnt5&#xD;
+KQo6mUvMu4Ck/CoESGY2WDXBj/MQWFtF1J2wAjNIZ0Mgx1vRQA/bhXe91C3uncazS0QotVMAjzZh&#xD;
+oBJFiBCqQthqaFeZYKiT1AJ0x6yuh5WHurO/dVGZqHgZLpCAC1prtuA6SJ+y1xqSSeAzrdDV7P43&#xD;
+Vxpl6ZL1F3Zz3kv5u8HwThtGJl8pW3kOLpkflC/6h7CaypBKmjdcDnSp4sqf79m1KGCF1CA9nwGa&#xD;
+lMWcdj8ymCOEv09aXpHinhD/jn3BtvXZZDROcuEBiDRDkI8rsrSiOYEWb2B1nL+UKD7DmVqw7vMX&#xD;
+DEZU8yGPd2BP9K9xsnRzghYitBwO7o9b1wIDAQABo1AwTjAdBgNVHQ4EFgQUMJrItZcudUBYX+8v&#xD;
+CpE/GINHU4gwHwYDVR0jBBgwFoAUMJrItZcudUBYX+8vCpE/GINHU4gwDAYDVR0TBAUwAwEB/zAN&#xD;
+BgkqhkiG9w0BAQsFAAOCAQEAcUl/BXv93YTAk3mlPwHKKHZtjNFlSCkVQgZVcIEDEEpELtVuMEep&#xD;
+QW3WkKLVP06g/B8yFAoR9P3WJqzkzCWMWDrYYMIx02aGCeKQAo8ITWIfTBUUDSypVfLpDH/HRI02&#xD;
+wc4zPzB6JL+uLK4ikJWC9XR1+zovFYCaeK6OPB3vDs/iufNjjsWREhvAgCTvl7JjxAub543TjhJN&#xD;
+u8RsSFQU6x27dgk6TvlKOKB7p/b191E0Zo2uFxAUtAlX1pvQc9JjEjLKkpQT0apRpFnBbRg97qkt&#xD;
+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&#xD;
+IwMPr5Ecu56kXRDiviiSCx/6HJXXZVN5wZ4vrI212OFAljBNp2KuxcEFKhY/jJFGew91Gd5tj+9t&#xD;
+EO6pOybxV0T/I1623RjifUiJHHvFSRTQ7kGo4ZjmZ+2TMCS1eJz7giXHY7o6HSOOUtWURiF3nODU&#xD;
+Xka4/c/MgN+LA2sbDl4XcHNmebvfC2c6KlfC1bKvynvAMLSVuvHoCOKdTLLhhPuSIG0v783ukhXO&#xD;
+7b7xZkiFSy/MLvR/KPh7spELXPwUKd8cxRd4bQ==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIDgTCCAmmgAwIBAgIJAMIi622nJ/aJMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAkNIMRQw&#xD;
+EgYDVQQIDAtTd2l0emVybGFuZDEPMA0GA1UEBwwGWnVyaWNoMSEwHwYDVQQKDBhJbnRlcm5ldCBX&#xD;
+aWRnaXRzIFB0eSBMdGQwHhcNMTcwMjE1MTQzMDE1WhcNMTgwMjE1MTQzMDE1WjBXMQswCQYDVQQG&#xD;
+EwJDSDEUMBIGA1UECAwLU3dpdHplcmxhbmQxDzANBgNVBAcMBlp1cmljaDEhMB8GA1UECgwYSW50&#xD;
+ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvnt5&#xD;
+KQo6mUvMu4Ck/CoESGY2WDXBj/MQWFtF1J2wAjNIZ0Mgx1vRQA/bhXe91C3uncazS0QotVMAjzZh&#xD;
+oBJFiBCqQthqaFeZYKiT1AJ0x6yuh5WHurO/dVGZqHgZLpCAC1prtuA6SJ+y1xqSSeAzrdDV7P43&#xD;
+Vxpl6ZL1F3Zz3kv5u8HwThtGJl8pW3kOLpkflC/6h7CaypBKmjdcDnSp4sqf79m1KGCF1CA9nwGa&#xD;
+lMWcdj8ymCOEv09aXpHinhD/jn3BtvXZZDROcuEBiDRDkI8rsrSiOYEWb2B1nL+UKD7DmVqw7vMX&#xD;
+DEZU8yGPd2BP9K9xsnRzghYitBwO7o9b1wIDAQABo1AwTjAdBgNVHQ4EFgQUMJrItZcudUBYX+8v&#xD;
+CpE/GINHU4gwHwYDVR0jBBgwFoAUMJrItZcudUBYX+8vCpE/GINHU4gwDAYDVR0TBAUwAwEB/zAN&#xD;
+BgkqhkiG9w0BAQsFAAOCAQEAcUl/BXv93YTAk3mlPwHKKHZtjNFlSCkVQgZVcIEDEEpELtVuMEep&#xD;
+QW3WkKLVP06g/B8yFAoR9P3WJqzkzCWMWDrYYMIx02aGCeKQAo8ITWIfTBUUDSypVfLpDH/HRI02&#xD;
+wc4zPzB6JL+uLK4ikJWC9XR1+zovFYCaeK6OPB3vDs/iufNjjsWREhvAgCTvl7JjxAub543TjhJN&#xD;
+u8RsSFQU6x27dgk6TvlKOKB7p/b191E0Zo2uFxAUtAlX1pvQc9JjEjLKkpQT0apRpFnBbRg97qkt&#xD;
+oilrK9xHukKPlz2i7WX+je62koICx2U85RwdneK9ZYivaPSk/zqpL1XFuLHG8Q==</X509Certificate></X509Data></KeyInfo></Signature>
\ No newline at end of file
-- 
GitLab