Hello all
I am sorry to bother the developers, but i am at the end of my (limited)
knowledge here. Attached to this mail is a piece of java Source code. I
am using the latest binary release.
I would expect to find this program outputing nothing, but instead,
verifying the signature fails. Since the javadoc was not very helpful, i
hope you can help me with this problem.
Thanks in Advance
Stefan
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.security.PrivateKey;
import java.security.PublicKey;
import org.apache.xml.security.Init;
import org.apache.xml.security.exceptions.XMLSecurityException;
import org.apache.xml.security.keys.KeyInfo;
import org.apache.xml.security.keys.content.KeyName;
import org.apache.xml.security.signature.XMLSignature;
import org.apache.xml.security.signature.XMLSignatureException;
import org.apache.xml.security.transforms.Transforms;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class XMLSignatureHelper {
private final String method;
private final PrivateKey secretKey;
private final PublicKey publicKey;
private final String keyName;
public XMLSignatureHelper(PublicKey pub){
this(pub, null, null);
}
public XMLSignatureHelper(String method, PublicKey pub){
this(method, pub, null, null);
}
public XMLSignatureHelper(PublicKey pub, PrivateKey priv, String
keyName){
this(ALGO_ID_SIGNATURE_DSA, pub, priv, keyName);
}
public XMLSignatureHelper(String method, PublicKey pub, PrivateKey
priv, String keyName){
if (!Init.isInitialized()){
Init.init();
}
this.method = method;
this.secretKey = priv;
this.publicKey = pub;
this.keyName = keyName;
}
public boolean verifySignature(Element e){
try {
XMLSignature sigObj = new XMLSignature(e, "");
PublicKey pub = publicKey;
if (pub == null){ // no definite PK, use provided PK of
signature
pub = sigObj.getKeyInfo().getPublicKey();
}
return sigObj.checkSignatureValue(pub);
} catch (XMLSignatureException e1) {
e1.printStackTrace();
} catch (XMLSecurityException e1) {
e1.printStackTrace();
}
return false;
}
public Element createSignature(Element... elements) throws
XMLSecurityException{
Document owner = elements[0].getOwnerDocument();
XMLSignature sigObj = new XMLSignature(owner, "", method);
for (Element e : elements){
Transforms t = new Transforms(owner);
t.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
sigObj.addDocument("#" + e.getAttribute("id"), t);
}
KeyInfo ki = sigObj.getKeyInfo();
KeyName kn = new KeyName(owner, keyName);
ki.add(kn);
sigObj.sign(secretKey);
return sigObj.getElement();
}
public static void main(String[] args) throws Exception {
KeyPair kp =
KeyPairGenerator.getInstance("DSA").generateKeyPair();
/* build the document */
DocumentBuilderFactory fac =
DocumentBuilderFactory.newInstance();
DocumentBuilder b = fac.newDocumentBuilder();
Document d = b.newDocument();
Element root = d.createElement("alpha");
Element e = d.createElement("beta");
e.setAttribute("id", "anID");
d.appendChild(root);
root.appendChild(e);
root.appendChild(d.createElement("gamma"));
/* create the signature helper */
XMLSignatureHelper sig = new XMLSignatureHelper(kp.getPublic(),
kp.getPrivate(), "A Name");
Element sig1 = sig.createSignature(e);
sig.createSignature(e);
root.appendChild(sig1);
if (!sig.verifySignature(sig1)){
System.err.println("Failed right away");
}
/*
* send the document once through a transformer to simulate a
* safe / load cycle
*/
Document d2 = b.newDocument();
Transformer t =
TransformerFactory.newInstance().newTransformer();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
t.transform(new DOMSource(d), new StreamResult(bout));
ByteArrayInputStream bin = new
ByteArrayInputStream(bout.toByteArray());
DOMResult result = new DOMResult(d2);
t.transform(new StreamSource(bin), result);
Element sig4 = (Element) d2.getDocumentElement().getLastChild();
if (!sig.verifySignature(sig4)){
System.err.println("Failed after transform");
}
}
}