/*
* Copyright 1999-2004 The Apache Software Foundation.
*
* Licensed 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 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.transforms.params.XPathFilterCHGPContainer;
import org.apache.xml.security.utils.Constants;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
* Sample for the XML Signature XPath Filter v2.0
*
* @author $Author: blautenb $
* @see XPath Filter v2.0 (TR)
* @see XPath Filter v2.0 (editors copy)
*/
public class SampleTransformXPathFilterCHGP {
/**
* Method main
*
* @param args
* @throws Exception
*/
public static void main(String args[]) throws Exception {
org.apache.xml.security.Init.init();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
// String inputDoc = "";
// String inputDoc = "";
String inputDoc =
"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
Document doc;
doc = db.parse(new ByteArrayInputStream(inputDoc.getBytes()));
SampleTransformXPathFilterCHGP.outApache(doc);
doc = db.parse(new ByteArrayInputStream(inputDoc.getBytes()));
SampleTransformXPathFilterCHGP.outXFilter2(doc);
}
/**
* Method outApache
*
* @param doc
* @throws Exception
*/
static void outApache(Document doc) throws Exception {
XMLSignature sig = new XMLSignature(doc, null,
XMLSignature.ALGO_ID_MAC_HMAC_SHA1);
doc.getDocumentElement().appendChild(sig.getElement());
Transforms transforms = new Transforms(doc);
String includeButSearchStr = "//B | //E | //F | //H";
String excludeButSearchStr = "//G";
// String excludeStr = "//C | //D | //ds:Signature";
String excludeStr =
"//C | //D | here()/ancestor::ds:Signature[1] | //@x:attr";
boolean includeSlashPolicy = XPathFilterCHGPContainer.ExcludeSlash;
XPathFilterCHGPContainer xpathContainer =
XPathFilterCHGPContainer.getInstance(doc, includeSlashPolicy,
includeButSearchStr,
excludeButSearchStr, excludeStr);
xpathContainer.setXPathNamespaceContext("ds", Constants.SignatureSpecNS);
xpathContainer.setXPathNamespaceContext("x", "http://foo.bar/");
transforms.addTransform(Transforms.TRANSFORM_XPATHFILTERCHGP,
xpathContainer.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);
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(
"-------------------------------------------------------------");
Element sE =
(Element) doc.getElementsByTagNameNS(Constants.SignatureSpecNS,
Constants._TAG_SIGNATURE).item(0);
XMLSignature sigVer = new XMLSignature(sE, null);
boolean verify =
sigVer.checkSignatureValue(sigVer
.createSecretKey("secret".getBytes()));
System.out.println("verify: " + verify);
}
/**
* Method outXFilter2
*
* @param doc
* @throws Exception
*/
static void outXFilter2(Document doc) throws Exception {
XMLSignature sig = new XMLSignature(doc, null,
XMLSignature.ALGO_ID_MAC_HMAC_SHA1);
doc.getDocumentElement().appendChild(sig.getElement());
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());
transforms.addTransform(Transforms.TRANSFORM_XPATH2FILTER,
XPath2FilterContainer.newInstanceSubtract(doc,
"//@x:attr").getElement());
transforms.setXPathNamespaceContext("xmlns:x", "http://foo.bar/");
transforms
.setXPathNamespaceContext(Transforms
.getDefaultPrefix(Transforms.TRANSFORM_XPATH2FILTER), Transforms
.TRANSFORM_XPATH2FILTER);
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);
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(
"-------------------------------------------------------------");
Element sE =
(Element) doc.getElementsByTagNameNS(Constants.SignatureSpecNS,
Constants._TAG_SIGNATURE).item(0);
XMLSignature sigVer = new XMLSignature(sE, null);
boolean verify =
sigVer.checkSignatureValue(sigVer
.createSecretKey("secret".getBytes()));
System.out.println("verify: " + verify);
}
/**
* 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).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(
"-------------------------------------------------------------");
}
}