blob: 5000851edbb4845592d7afa97553253a436044a6 [file] [log] [blame]
/**
* 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()
);
}
}