| /** |
| * 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.samples.transforms; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.FileOutputStream; |
| |
| import javax.xml.parsers.DocumentBuilder; |
| import javax.xml.parsers.DocumentBuilderFactory; |
| |
| import org.apache.xml.security.c14n.Canonicalizer; |
| import org.apache.xml.security.signature.XMLSignature; |
| import org.apache.xml.security.transforms.Transforms; |
| import org.apache.xml.security.transforms.params.XPath2FilterContainer; |
| import org.apache.xml.security.utils.Constants; |
| import org.apache.xml.security.utils.ElementProxy; |
| import org.apache.xml.security.utils.JavaUtils; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.NodeList; |
| |
| /** |
| * Sample for the <I>XML Signature XPath Filter v2.0</I> |
| * |
| * @author $Author$ |
| * @see <A HREF="http://www.w3.org/TR/xmldsig-filter2/">XPath Filter v2.0 (TR)</A> |
| * @see <A HREF=http://www.w3.org/Signature/Drafts/xmldsig-xfilter2/"> |
| * XPath Filter v2.0 (editors copy)</A> |
| */ |
| |
| public class SampleTransformXPath2Filter2 { |
| |
| /** |
| * Method main |
| * |
| * @param args |
| * @throws Exception |
| */ |
| public static void main(String args[]) throws Exception { |
| |
| org.apache.xml.security.Init.init(); |
| |
| boolean verbose = true; |
| |
| create("build/withComments.xml", true, verbose); |
| System.out.println(); |
| System.out.println(); |
| System.out.println(); |
| create("build/omitComments.xml", false, verbose); |
| System.out.println(); |
| System.out.println(); |
| System.out.println(); |
| check("build/withComments.xml"); |
| } |
| |
| /** |
| * Method create |
| * |
| * @param filename |
| * @param withComments |
| * @param verbose |
| * @throws Exception |
| */ |
| public static void create( |
| String filename, boolean withComments, boolean verbose |
| ) throws Exception { |
| |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| |
| dbf.setNamespaceAware(true); |
| |
| DocumentBuilder db = dbf.newDocumentBuilder(); |
| String inputDoc = "<A><UNSIGNED><B><SIGNED><MORE_SIGNED_STUFF/></SIGNED><C><UNSIGNED/></C></B><D><UNSIGNED/></D><UNSIGNED><E><SIGNED><MORE_SIGNED_STUFF/></SIGNED></E><UNSIGNED><F><G><H/></G></F></UNSIGNED></UNSIGNED></UNSIGNED></A>"; |
| |
| Document doc = db.parse(new ByteArrayInputStream(inputDoc.getBytes())); |
| XMLSignature sig = new XMLSignature(doc, null, XMLSignature.ALGO_ID_MAC_HMAC_SHA1); |
| |
| doc.getDocumentElement().appendChild(sig.getElement()); |
| sig.getElement().setAttributeNS( |
| Constants.NamespaceSpecNS, |
| "xmlns:" + ElementProxy.getDefaultPrefix(Transforms.TRANSFORM_XPATH2FILTER), |
| Transforms.TRANSFORM_XPATH2FILTER |
| ); |
| doc.getDocumentElement().appendChild(doc.createTextNode("\n")); |
| |
| Transforms transforms = new Transforms(doc); |
| |
| transforms.addTransform(Transforms.TRANSFORM_XPATH2FILTER, |
| XPath2FilterContainer.newInstanceIntersect(doc, "//E").getElement()); |
| |
| transforms.addTransform(Transforms.TRANSFORM_XPATH2FILTER, |
| XPath2FilterContainer.newInstanceUnion(doc, "//B").getElement()); |
| transforms.addTransform(Transforms.TRANSFORM_XPATH2FILTER, |
| XPath2FilterContainer.newInstanceSubtract(doc, "//C").getElement()); |
| |
| transforms.addTransform(Transforms.TRANSFORM_XPATH2FILTER, |
| XPath2FilterContainer.newInstanceUnion(doc, "//F").getElement()); |
| transforms.addTransform(Transforms.TRANSFORM_XPATH2FILTER, |
| XPath2FilterContainer.newInstanceSubtract(doc, "//G").getElement()); |
| transforms.addTransform(Transforms.TRANSFORM_XPATH2FILTER, |
| XPath2FilterContainer.newInstanceUnion(doc, "//H").getElement()); |
| |
| sig.addDocument("", transforms); |
| |
| String secretKey = "secret"; |
| |
| sig.getKeyInfo().addKeyName("The UTF-8 octets of \"" + secretKey |
| + "\" are used for signing (" + secretKey.length() + " octets)"); |
| sig.sign(sig.createSecretKey(secretKey.getBytes())); |
| |
| Canonicalizer c14n = |
| Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS); |
| byte[] full = c14n.canonicalizeSubtree(doc); |
| FileOutputStream fos = new FileOutputStream(filename); |
| |
| try { |
| fos.write(full); |
| } finally { |
| fos.close(); |
| } |
| |
| if (verbose) { |
| System.out.println( |
| "-------------------------------------------------------------"); |
| System.out.println("Input to the transforms is"); |
| System.out.println( |
| "-------------------------------------------------------------"); |
| System.out.println( |
| new String(sig.getSignedInfo().item(0).getContentsBeforeTransformation().getBytes()) |
| ); |
| System.out.println( |
| "-------------------------------------------------------------"); |
| System.out |
| .println("The signed octets (output of the transforms) are "); |
| System.out.println( |
| "-------------------------------------------------------------"); |
| System.out.println( |
| new String(sig.getSignedInfo().item(0).getTransformsOutput().getBytes()) |
| ); |
| System.out.println( |
| "-------------------------------------------------------------"); |
| System.out.println("The document is "); |
| System.out.println( |
| "-------------------------------------------------------------"); |
| System.out.println(new String(full)); |
| System.out.println( |
| "-------------------------------------------------------------"); |
| } |
| } |
| |
| /** |
| * Method check |
| * |
| * @param filename |
| * @throws Exception |
| */ |
| public static void check(String filename) throws Exception { |
| |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| |
| dbf.setNamespaceAware(true); |
| |
| DocumentBuilder db = dbf.newDocumentBuilder(); |
| Document doc = db.parse(new FileInputStream(filename)); |
| NodeList sigs = doc.getElementsByTagNameNS(Constants.SignatureSpecNS, Constants._TAG_SIGNATURE); |
| |
| XMLSignature sig = |
| new XMLSignature((Element)sigs.item(0), new File(filename).toURI().toURL().toString()); |
| boolean check = sig.checkSignatureValue(sig.createSecretKey("secret".getBytes())); |
| |
| System.out.println( |
| "-------------------------------------------------------------"); |
| System.out.println("Verification of " + filename + ": " + check); |
| System.out.println( |
| "-------------------------------------------------------------"); |
| System.out.println(new String(sig.getSignedInfo().item(0).getTransformsOutput().getBytes())); |
| System.out.println( |
| "-------------------------------------------------------------"); |
| |
| JavaUtils.writeBytesToFilename( |
| "build/1.html", sig.getSignedInfo().item(0).getHTMLRepresentation().getBytes() |
| ); |
| } |
| |
| } |