| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.apache.xml.security.test.stax.c14n; |
| |
| import org.apache.xml.security.test.stax.utils.UnixInputStream; |
| import org.junit.Test; |
| |
| import org.apache.xml.security.stax.ext.stax.XMLSecEvent; |
| import org.apache.xml.security.stax.impl.transformer.canonicalizer.Canonicalizer20010315_OmitCommentsTransformer; |
| import org.apache.xml.security.stax.impl.transformer.canonicalizer.Canonicalizer20010315_WithCommentsTransformer; |
| import org.apache.xml.security.stax.impl.transformer.canonicalizer.CanonicalizerBase; |
| import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator; |
| |
| import javax.xml.namespace.QName; |
| import javax.xml.stream.XMLEventReader; |
| import javax.xml.stream.XMLInputFactory; |
| import javax.xml.stream.XMLResolver; |
| import javax.xml.stream.XMLStreamException; |
| |
| import static org.junit.Assert.*; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.net.URL; |
| import java.nio.charset.StandardCharsets; |
| |
| /** |
| */ |
| public class Canonicalizer20010315Test { |
| |
| private XMLInputFactory xmlInputFactory; |
| |
| public Canonicalizer20010315Test() throws Exception { |
| this.xmlInputFactory = XMLInputFactory.newInstance(); |
| this.xmlInputFactory.setEventAllocator(new XMLSecEventAllocator()); |
| XMLResolver xmlResolver = new XMLResolver() { |
| @Override |
| public Object resolveEntity(String publicID, String systemID, String baseURI, String namespace) throws XMLStreamException { |
| return this.getClass().getClassLoader().getResourceAsStream( |
| "org/apache/xml/security/c14n/in/" + systemID); |
| } |
| }; |
| this.xmlInputFactory.setXMLResolver(xmlResolver); |
| } |
| |
| @Test |
| public void test221() throws Exception { |
| |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| Canonicalizer20010315_WithCommentsTransformer c = new Canonicalizer20010315_WithCommentsTransformer(); |
| c.setOutputStream(baos); |
| XMLEventReader xmlSecEventReader = xmlInputFactory.createXMLEventReader( |
| this.getClass().getClassLoader().getResourceAsStream( |
| "org/apache/xml/security/c14n/inExcl/example2_2_1.xml") |
| ); |
| |
| XMLSecEvent xmlSecEvent = null; |
| while (xmlSecEventReader.hasNext()) { |
| xmlSecEvent = (XMLSecEvent) xmlSecEventReader.nextEvent(); |
| if (xmlSecEvent.isStartElement() && xmlSecEvent.asStartElement().getName().equals(new QName("http://example.net", "elem2"))) { |
| break; |
| } |
| } |
| while (xmlSecEventReader.hasNext()) { |
| |
| c.transform(xmlSecEvent); |
| |
| if (xmlSecEvent.isEndElement() && xmlSecEvent.asEndElement().getName().equals(new QName("http://example.net", "elem2"))) { |
| break; |
| } |
| xmlSecEvent = (XMLSecEvent) xmlSecEventReader.nextEvent(); |
| } |
| |
| byte[] reference = getBytesFromResource(this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/inExcl/example2_2_1_c14nized.xml")); |
| boolean equals = java.security.MessageDigest.isEqual(reference, baos.toByteArray()); |
| |
| if (!equals) { |
| System.out.println("Expected:\n" + new String(reference, StandardCharsets.UTF_8)); |
| System.out.println(""); |
| System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8)); |
| } |
| |
| assertTrue(equals); |
| } |
| |
| @Test |
| public void test222() throws Exception { |
| |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| Canonicalizer20010315_WithCommentsTransformer c = new Canonicalizer20010315_WithCommentsTransformer(); |
| c.setOutputStream(baos); |
| XMLEventReader xmlSecEventReader = xmlInputFactory.createXMLEventReader( |
| this.getClass().getClassLoader().getResourceAsStream( |
| "org/apache/xml/security/c14n/inExcl/example2_2_2.xml") |
| ); |
| |
| XMLSecEvent xmlSecEvent = null; |
| while (xmlSecEventReader.hasNext()) { |
| xmlSecEvent = (XMLSecEvent) xmlSecEventReader.nextEvent(); |
| if (xmlSecEvent.isStartElement() && xmlSecEvent.asStartElement().getName().equals(new QName("http://example.net", "elem2"))) { |
| break; |
| } |
| } |
| while (xmlSecEventReader.hasNext()) { |
| |
| c.transform(xmlSecEvent); |
| |
| if (xmlSecEvent.isEndElement() && xmlSecEvent.asEndElement().getName().equals(new QName("http://example.net", "elem2"))) { |
| break; |
| } |
| xmlSecEvent = (XMLSecEvent) xmlSecEventReader.nextEvent(); |
| } |
| |
| byte[] reference = |
| getBytesFromResource(this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/inExcl/example2_2_2_c14nized.xml")); |
| boolean equals = java.security.MessageDigest.isEqual(reference, baos.toByteArray()); |
| |
| if (!equals) { |
| System.out.println("Expected:\n" + new String(reference, StandardCharsets.UTF_8)); |
| System.out.println(""); |
| System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8)); |
| } |
| |
| assertTrue(equals); |
| } |
| |
| /** |
| * 3.1 PIs, Comments, and Outside of Document Element |
| */ |
| @Test |
| public void test31withCommentsSubtree() throws Exception { |
| |
| URL fileIn = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/31_input.xml"); |
| URL fileRef = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/31_c14n-comments.xml"); |
| |
| c14nAndCompare(fileIn, fileRef, false); |
| } |
| |
| /** |
| * 3.1 PIs, Comments, and Outside of Document Element |
| * |
| * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-OutsideDoc">the example from the spec</A> |
| */ |
| @Test |
| public void test31subtree() throws Exception { |
| |
| URL fileIn = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/31_input.xml"); |
| URL fileRef = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/31_c14n.xml"); |
| |
| c14nAndCompare(fileIn, fileRef, true); |
| } |
| |
| /** |
| * 3.2 Whitespace in Document Content |
| * |
| * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-WhitespaceInContent">the example from the spec</A> |
| */ |
| @Test |
| public void test32subtree() throws Exception { |
| |
| URL fileIn = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/32_input.xml"); |
| URL fileRef = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/32_c14n.xml"); |
| |
| c14nAndCompare(fileIn, fileRef, true); |
| } |
| |
| /** |
| * 3.3 Start and End Tags |
| * |
| * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-SETags">the example from the spec</A> |
| */ |
| @Test |
| public void test33subtree() throws Exception { |
| |
| URL fileIn = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/33_input.xml"); |
| URL fileRef = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/33_c14n.xml"); |
| |
| c14nAndCompare(fileIn, fileRef, true); |
| } |
| |
| /** |
| * 3.4 Character Modifications and Character References |
| * |
| * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-Chars">the example from the spec</A> |
| */ |
| @Test |
| public void test34() throws Exception { |
| |
| URL fileIn = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/34_input.xml"); |
| URL fileRef = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/34_c14n.xml"); |
| |
| c14nAndCompare(fileIn, fileRef, true); |
| } |
| |
| /** |
| * 3.4 Character Modifications and Character References (patched to run on validating Parsers) |
| * <p></p> |
| * <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119"> The spec</A> states that: |
| * <p></p> |
| * Note: The last element, normId, is well-formed but violates a validity |
| * constraint for attributes of type ID. For testing canonical XML |
| * implementations based on validating processors, remove the line |
| * containing this element from the input and canonical form. In general, |
| * XML consumers should be discouraged from using this feature of XML. |
| * |
| * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-Chars">the example from the spec</A> |
| */ |
| @Test |
| public void test34subtree() throws Exception { |
| URL fileIn = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/34_input_validatingParser.xml"); |
| URL fileRef = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/34_c14n_validatingParser.xml"); |
| |
| c14nAndCompare(fileIn, fileRef, true); |
| } |
| |
| /** |
| * 3.5 Entity References |
| * |
| * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-Entities">the example from the spec</A> |
| */ |
| @Test |
| public void test35subtree() throws Exception { |
| |
| URL fileIn = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/35_input.xml"); |
| URL fileRef = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/35_c14n.xml"); |
| |
| c14nAndCompare(fileIn, fileRef, true); |
| } |
| |
| /** |
| * 3.6 UTF-8 Encoding |
| * |
| * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-UTF8">the example from the spec</A> |
| */ |
| @Test |
| public void test36subtree() throws Exception { |
| |
| URL fileIn = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/36_input.xml"); |
| URL fileRef = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/36_c14n.xml"); |
| |
| c14nAndCompare(fileIn, fileRef, true); |
| } |
| |
| // /** |
| // * 3.7 Document Subsets |
| // * |
| // * @throws CanonicalizationException |
| // * @throws java.io.FileNotFoundException |
| // * @throws java.io.IOException |
| // * @throws InvalidCanonicalizerException |
| // * @throws javax.xml.parsers.ParserConfigurationException |
| // * @throws org.xml.sax.SAXException |
| // * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-DocSubsets">the example from the spec</A> |
| // * @throws javax.xml.transform.TransformerException |
| // */ |
| // public static void test37() throws Exception { |
| // |
| // String descri = "3.7 Document Subsets. (uncommented)"; |
| // String fileIn = prefix + "in/37_input.xml"; |
| // String fileRef = prefix + "in/37_c14n.xml"; |
| // String fileOut = prefix + "out/xpath_37_output.xml"; |
| // String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS; |
| // boolean validating = true; |
| // Element xpath = null; |
| // DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); |
| // |
| // dfactory.setNamespaceAware(true); |
| // |
| // DocumentBuilder db = dfactory.newDocumentBuilder(); |
| // Document doc = db.newDocument(); |
| // |
| // xpath = XMLUtils.createElementInSignatureSpace(doc, Constants._TAG_XPATH); |
| // |
| // xpath.setAttributeNS(Constants.NamespaceSpecNS, "xmlns:ietf", "http://www.ietf.org"); |
| // |
| // //J- |
| // String xpathFromSpec = |
| // "(//. | //@* | //namespace::*)" |
| // + "[ " |
| // + "self::ietf:e1 or " |
| // + "(parent::ietf:e1 and not(self::text() or self::e2)) or " |
| // + "count(id(\"E3\")|ancestor-or-self::node()) = count(ancestor-or-self::node()) " |
| // + "]"; |
| // |
| // //J+ |
| // xpath.appendChild(doc.createTextNode(xpathFromSpec)); |
| // assertTrue(descri, |
| // c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, |
| // xpath)); |
| // } |
| // |
| |
| /** |
| * Note: This specification supports the recent XML plenary decision to |
| * deprecate relative namespace URIs as follows: implementations of XML |
| * canonicalization MUST report an operation failure on documents containing |
| * relative namespace URIs. XML canonicalization MUST NOT be implemented |
| * with an XML parser that converts relative URIs to absolute URIs. |
| * <p></p> |
| * Implementations MUST report an operation failure on documents containing |
| * relative namespace URIs. |
| */ |
| @Test |
| public void testRelativeNSbehaviour() throws Exception { |
| |
| URL fileIn = |
| this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/relative-ns-behaviour.xml"); |
| |
| try { |
| c14nAndCompare(fileIn, fileIn, true); |
| fail(); |
| } catch (XMLStreamException cex) { |
| assertTrue(cex != null); |
| } |
| } |
| |
| @Test |
| public void testDefault_ns_redefinition() throws Exception { |
| |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| Canonicalizer20010315_WithCommentsTransformer c = new Canonicalizer20010315_WithCommentsTransformer(); |
| c.setOutputStream(baos); |
| XMLEventReader xmlSecEventReader = xmlInputFactory.createXMLEventReader( |
| this.getClass().getClassLoader().getResourceAsStream( |
| "org/apache/xml/security/c14n/in/default_ns_redefinition_input.xml") |
| ); |
| |
| XMLSecEvent xmlSecEvent = null; |
| while (xmlSecEventReader.hasNext()) { |
| xmlSecEvent = (XMLSecEvent) xmlSecEventReader.nextEvent(); |
| if (xmlSecEvent.isStartElement() && xmlSecEvent.asStartElement().getName().equals(new QName("http://www.w3.org/2000/09/xmldsig#", "Object"))) { |
| break; |
| } |
| } |
| while (xmlSecEventReader.hasNext()) { |
| |
| c.transform(xmlSecEvent); |
| |
| if (xmlSecEvent.isEndElement() && xmlSecEvent.asEndElement().getName().equals(new QName("http://www.w3.org/2000/09/xmldsig#", "Object"))) { |
| break; |
| } |
| xmlSecEvent = (XMLSecEvent) xmlSecEventReader.nextEvent(); |
| } |
| |
| byte[] reference = |
| getBytesFromResource(this.getClass().getClassLoader().getResource( |
| "org/apache/xml/security/c14n/in/default_ns_redefinition_c14n.xml"), true); |
| boolean equals = java.security.MessageDigest.isEqual(reference, baos.toByteArray()); |
| |
| if (!equals) { |
| System.out.println("Expected:\n" + new String(reference, StandardCharsets.UTF_8)); |
| System.out.println(""); |
| System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8)); |
| } |
| |
| assertTrue(equals); |
| } |
| |
| // /** |
| // * The XPath data model represents data using UCS characters. |
| // * Implementations MUST use XML processors that support UTF-8 and UTF-16 |
| // * and translate to the UCS character domain. For UTF-16, the leading byte |
| // * order mark is treated as an artifact of encoding and stripped from the |
| // * UCS character data (subsequent zero width non-breaking spaces appearing |
| // * within the UTF-16 data are not removed) [UTF-16, Section 3.2]. Support |
| // * for ISO-8859-1 encoding is RECOMMENDED, and all other character encodings |
| // * are OPTIONAL. |
| // * |
| // * $todo$ implement the test |
| // * @throws CanonicalizationException |
| // * @throws java.io.FileNotFoundException |
| // * @throws java.io.IOException |
| // * @throws InvalidCanonicalizerException |
| // * @throws javax.xml.parsers.ParserConfigurationException |
| // * @throws org.xml.sax.SAXException |
| // * @throws javax.xml.transform.TransformerException |
| // */ |
| // public static void testTranslationFromUTF16toUTF8() throws Exception { |
| // |
| // String val = |
| // "<UTF16>The german &auml (which is Unicode &#xE4;): "ä"</UTF16>"; |
| // byte utf16[] = convertToUTF16(val.getBytes()); |
| // Canonicalizer c14n = |
| // Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS); |
| // byte c14nBytes[] = c14n.canonicalize(utf16); |
| // org.xml.sax.EntityResolver resolver = new TestVectorResolver(); |
| // InputStream refStream = resolver.resolveEntity( |
| // null, |
| // prefix + "/in/testTranslationFromUTF16toUTF8.xml") |
| // .getByteStream(); |
| // byte refBytes[] = JavaUtils.getBytesFromStream(refStream); |
| // boolean equal = java.security.MessageDigest.isEqual(refBytes, c14nBytes); |
| // |
| // assertTrue("Parser does not translate to UCS character domain", equal); |
| // } |
| // |
| // /** |
| // * Method testXMLAttributes1 |
| // * |
| // * @throws CanonicalizationException |
| // * @throws java.io.FileNotFoundException |
| // * @throws java.io.IOException |
| // * @throws InvalidCanonicalizerException |
| // * @throws javax.xml.parsers.ParserConfigurationException |
| // * @throws org.xml.sax.SAXException |
| // * @throws javax.xml.transform.TransformerException |
| // */ |
| // public static void testXMLAttributes1() throws Exception { |
| // //J- |
| // String input = "" |
| // + "<included xml:lang='de'>" |
| // + "<notIncluded xml:lang='de'>" |
| // + "<notIncluded xml:lang='uk'>" |
| // + "<included >" |
| // + "</included>" |
| // + "</notIncluded>" |
| // + "</notIncluded>" |
| // + "</included>"; |
| // |
| // String definedOutput = "" |
| // + "<included xml:lang=\"de\">" |
| // + "<included xml:lang=\"uk\">" |
| // + "</included>" |
| // + "</included>"; |
| // //J+ |
| // assertTrue(doTestXMLAttributes(input, definedOutput)); |
| // } |
| // |
| // /** |
| // * Method testXMLAttributes2 |
| // * |
| // * @throws CanonicalizationException |
| // * @throws java.io.FileNotFoundException |
| // * @throws java.io.IOException |
| // * @throws InvalidCanonicalizerException |
| // * @throws javax.xml.parsers.ParserConfigurationException |
| // * @throws org.xml.sax.SAXException |
| // * @throws javax.xml.transform.TransformerException |
| // */ |
| // public static void testXMLAttributes2() throws Exception { |
| // //J- |
| // String input = "" |
| // + "<included xml:lang='uk'>" |
| // + "<notIncluded xml:lang='de'>" |
| // + "<notIncluded xml:lang='uk'>" |
| // + "<included >" |
| // + "</included>" |
| // + "</notIncluded>" |
| // + "</notIncluded>" |
| // + "</included>"; |
| // |
| // String definedOutput = "" |
| // + "<included xml:lang=\"uk\">" |
| // + "<included xml:lang=\"uk\">" |
| // + "</included>" |
| // + "</included>"; |
| // //J+ |
| // assertTrue(doTestXMLAttributes(input, definedOutput)); |
| // } |
| // |
| // /** |
| // * Method testXMLAttributes3 |
| // * |
| // * @throws CanonicalizationException |
| // * @throws java.io.FileNotFoundException |
| // * @throws java.io.IOException |
| // * @throws InvalidCanonicalizerException |
| // * @throws javax.xml.parsers.ParserConfigurationException |
| // * @throws org.xml.sax.SAXException |
| // * @throws javax.xml.transform.TransformerException |
| // */ |
| // public static void testXMLAttributes3() throws Exception { |
| // //J- |
| // String input = "" |
| // + "<included xml:lang='de'>" |
| // + "<notIncluded xml:lang='de'>" |
| // + "<notIncluded xml:lang='uk'>" |
| // + "<included xml:lang='de'>" |
| // + "</included>" |
| // + "</notIncluded>" |
| // + "</notIncluded>" |
| // + "</included>"; |
| // |
| // String definedOutput = "" |
| // + "<included xml:lang=\"de\">" |
| // + "<included xml:lang=\"de\">" |
| // + "</included>" |
| // + "</included>"; |
| // //J+ |
| // assertTrue(doTestXMLAttributes(input, definedOutput)); |
| // } |
| // |
| // /** |
| // * Method testXMLAttributes4 |
| // * |
| // * @throws CanonicalizationException |
| // * @throws java.io.FileNotFoundException |
| // * @throws java.io.IOException |
| // * @throws InvalidCanonicalizerException |
| // * @throws javax.xml.parsers.ParserConfigurationException |
| // * @throws org.xml.sax.SAXException |
| // * @throws javax.xml.transform.TransformerException |
| // */ |
| // public static void _testXMLAttributes4() throws Exception { |
| // //J- |
| // String input = "" |
| // + "<included xml:lang='de'>" |
| // + "<included xml:lang='de'>" |
| // + "<notIncluded xml:lang='uk'>" |
| // + "<included >" |
| // + "</included>" |
| // + "</notIncluded>" |
| // + "</included>" |
| // + "</included>"; |
| // |
| // String definedOutput = "" |
| // + "<included xml:lang=\"de\">" |
| // + "<included>" |
| // + "<included xml:lang=\"uk\">" |
| // + "</included>" |
| // + "</included>" |
| // + "</included>"; |
| // //J+ |
| // assertTrue(doTestXMLAttributes(input, definedOutput)); |
| // } |
| // |
| // /** |
| // * Method testXMLAttributes5 |
| // * |
| // * @throws CanonicalizationException |
| // * @throws java.io.FileNotFoundException |
| // * @throws java.io.IOException |
| // * @throws InvalidCanonicalizerException |
| // * @throws javax.xml.parsers.ParserConfigurationException |
| // * @throws org.xml.sax.SAXException |
| // * @throws javax.xml.transform.TransformerException |
| // */ |
| // public static void _testXMLAttributes5() throws Exception { |
| // //J- |
| // String input = "" |
| // + "<included xml:lang='de'>" |
| // + "<included xml:lang='de'>" |
| // + "<notIncluded xml:space='preserve' xml:lang='uk'>" |
| // + "<included >" |
| // + "</included>" |
| // + "</notIncluded>" |
| // + "</included>" |
| // + "</included>"; |
| // |
| // String definedOutput = "" |
| // + "<included xml:lang=\"de\">" |
| // + "<included>" |
| // + "<included xml:lang=\"uk\" xml:space=\"preserve\">" |
| // + "</included>" |
| // + "</included>" |
| // + "</included>"; |
| // //J+ |
| // assertTrue(doTestXMLAttributes(input, definedOutput)); |
| // } |
| // |
| // /** |
| // * Method testXMLAttributes6 |
| // * |
| // * @throws CanonicalizationException |
| // * @throws java.io.FileNotFoundException |
| // * @throws java.io.IOException |
| // * @throws InvalidCanonicalizerException |
| // * @throws javax.xml.parsers.ParserConfigurationException |
| // * @throws org.xml.sax.SAXException |
| // * @throws javax.xml.transform.TransformerException |
| // */ |
| // public static void _testXMLAttributes6() throws Exception { |
| // //J- |
| // String input = "" |
| // + "<included xml:space='preserve' xml:lang='de'>" |
| // + "<included xml:lang='de'>" |
| // + "<notIncluded xml:lang='uk'>" |
| // + "<included>" |
| // + "</included>" |
| // + "</notIncluded>" |
| // + "</included>" |
| // + "</included>"; |
| // |
| // String definedOutput = "" |
| // + "<included xml:lang=\"de\" xml:space=\"preserve\">" |
| // + "<included>" |
| // + "<included xml:lang=\"uk\" xml:space=\"preserve\">" |
| // + "</included>" |
| // + "</included>" |
| // + "</included>"; |
| // //J+ |
| // assertTrue(doTestXMLAttributes(input, definedOutput)); |
| // } |
| // |
| // /** |
| // * Method doTestXMLAttributes |
| // * |
| // * @param input |
| // * @param definedOutput |
| // * @param writeResultsToFile |
| // * |
| // * @throws CanonicalizationException |
| // * @throws java.io.FileNotFoundException |
| // * @throws java.io.IOException |
| // * @throws InvalidCanonicalizerException |
| // * @throws javax.xml.parsers.ParserConfigurationException |
| // * @throws org.xml.sax.SAXException |
| // * @throws javax.xml.transform.TransformerException |
| // */ |
| // private static boolean doTestXMLAttributes( |
| // String input, String definedOutput) throws Exception { |
| // |
| // DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); |
| // |
| // dfactory.setNamespaceAware(true); |
| // dfactory.setValidating(true); |
| // |
| // DocumentBuilder db = dfactory.newDocumentBuilder(); |
| // |
| // db.setErrorHandler(new org.apache.xml.security.utils |
| // .IgnoreAllErrorHandler()); |
| // |
| // Document doc = db.parse(new ByteArrayInputStream(input.getBytes())); |
| // Canonicalizer c14nizer = |
| // Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS); |
| // CachedXPathAPI xpathAPI = new CachedXPathAPI(); |
| // |
| // //XMLUtils.circumventBug2650(doc); |
| // |
| // NodeList nodes = |
| // xpathAPI.selectNodeList(doc, "(//*[local-name()='included'] | //@*[parent::node()[local-name()='included']])"); |
| // byte result[] = c14nizer.canonicalizeXPathNodeSet(nodes); |
| // byte defined[] = definedOutput.getBytes(); |
| // assertEquals(definedOutput, new String(result)); |
| // return java.security.MessageDigest.isEqual(defined, result); |
| // } |
| |
| /** |
| * Method c14nAndCompare |
| */ |
| private void c14nAndCompare( |
| URL fileIn, URL fileRef, boolean ommitComments) throws Exception { |
| |
| CanonicalizerBase canonicalizerBase; |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| if (ommitComments) { |
| canonicalizerBase = new Canonicalizer20010315_OmitCommentsTransformer(); |
| canonicalizerBase.setOutputStream(baos); |
| } else { |
| canonicalizerBase = new Canonicalizer20010315_WithCommentsTransformer(); |
| canonicalizerBase.setOutputStream(baos); |
| } |
| |
| XMLEventReader xmlSecEventReader = xmlInputFactory.createXMLEventReader(fileIn.openStream()); |
| while (xmlSecEventReader.hasNext()) { |
| XMLSecEvent xmlSecEvent = (XMLSecEvent) xmlSecEventReader.nextEvent(); |
| canonicalizerBase.transform(xmlSecEvent); |
| } |
| |
| // org.xml.sax.InputSource refIs = resolver.resolveEntity(null, fileRef); |
| // byte refBytes[] = JavaUtils.getBytesFromStream(refIs.getByteStream()); |
| byte refBytes[] = getBytesFromResource(fileRef); |
| |
| // if everything is OK, result is true; we do a binary compare, byte by byte |
| boolean result = java.security.MessageDigest.isEqual(refBytes, baos.toByteArray()); |
| if (!result) { |
| assertEquals(new String(baos.toByteArray(), StandardCharsets.UTF_8), new String(refBytes, StandardCharsets.UTF_8)); |
| } |
| assertTrue(result); |
| } |
| |
| public static byte[] getBytesFromResource(URL resource) throws IOException { |
| return getBytesFromResource(resource, false); |
| } |
| |
| public static byte[] getBytesFromResource(URL resource, boolean unix) throws IOException { |
| |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| InputStream inputStream = resource.openStream(); |
| if (unix) { |
| inputStream = new UnixInputStream(inputStream); |
| } |
| try { |
| byte buf[] = new byte[1024]; |
| int len; |
| while ((len = inputStream.read(buf)) > 0) { |
| baos.write(buf, 0, len); |
| } |
| |
| return baos.toByteArray(); |
| } finally { |
| inputStream.close(); |
| } |
| } |
| |
| // /** |
| // * This method takes the input bytes as XML Document and converts it to an |
| // * UTF-16 encoded XML document which is serialized to byte[] and returned. |
| // * |
| // * @param input |
| // * |
| // * @throws java.io.IOException |
| // * @throws javax.xml.parsers.ParserConfigurationException |
| // * @throws org.xml.sax.SAXException |
| // * @throws javax.xml.transform.TransformerConfigurationException |
| // * @throws javax.xml.transform.TransformerException |
| // */ |
| // public static byte[] convertToUTF16(byte input[]) throws Exception { |
| // |
| // //String ENCODING_ISO8859_1 = "ISO-8859-1"; |
| // //String ENCODING_UTF8 = StandardCharsets.UTF_8; |
| // String ENCODING_UTF16 = "UTF-16"; |
| // DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| // DocumentBuilder db = dbf.newDocumentBuilder(); |
| // Document doc = db.parse(new ByteArrayInputStream(input)); |
| // TransformerFactory tFactory = TransformerFactory.newInstance(); |
| // Transformer transformer = tFactory.newTransformer(); |
| // |
| // transformer.setOutputProperty(OutputKeys.ENCODING, ENCODING_UTF16); |
| // transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); |
| // |
| // DOMSource source = new DOMSource(doc); |
| // ByteArrayOutputStream os = new ByteArrayOutputStream(); |
| // StreamResult result = new StreamResult(os); |
| // |
| // transformer.transform(source, result); |
| // |
| // return os.toByteArray(); |
| // } |
| } |