Make sure you set your factory to be namespace aware, i.e.

DocumentBuilderFactory fac =
    DocumentBuilderFactory.newInstance();
fac.setNamespaceAware(true);

--Sean

Stefan Schulz wrote:
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");
        }
    }
}


Reply via email to