Thank you, Raul. I've tried in v1.3.0 and v1.4.0, both complain the same way.
Attached is:
(1) VerifySignature.java taken from
xml-security-bin-1.3.0 zip, in directory
src_samples/org/apache/xml/security/samples/signature
I added ability to specify signature file to verify on the
command line
(2) sig1.xml (verifies correctly)
(3) Word-plugin-signature.xml (do not verify due to hash failures
on Objects "#idsigInvalidImage" and "#idsigValidImage")
(4) Output from Aleksey's xmlsec1 command-line tool trying to verify
Word-plugin-signature.xml and getting the correct hash where
Apache-XMLSec does not. (Word-plugin-signature_xmlsec1output.txt)
Cheers,
JLC
On Mon, Feb 26, 2007 at 04:33:18PM +0000, Raul Benito wrote:
>
> Hi Jean-Luc,
> I will try to take a look to the issue, but can you send us the
> document and the code you are using?
> And thanks for telling.
> Regards,
> Raul,
>
> On 2/26/07, Jean-Luc Cooke <[EMAIL PROTECTED]> wrote:
>
> To help things along,
> Here's the output from Aleksey's tool. Notice how it verifies
> "#idsigInvalidImage" and "#idsigValidImage" but ApacheXMLSec
> cannot.
> The overall signature status fails with Aleksey's tool, but that's
> not
> what I'm focusing on.
> Is the fact that ApacheXMLSec cannot verify idsigInvalidImage and
> idsigValidImage a bug?
> JLC
> On Mon, Feb 26, 2007 at 09:54:15AM -0500, Jean-Luc Cooke wrote:
> > Sorry to ping here.
> >
> > Can anyone point me in the direction of "If this a bug with
> Apache XMLSec?"
> >
> > I'd really exect the evil empire of Microsoft and Apache to
> interoperate.
> >
> > JLC
> >
> > On Wed, Feb 21, 2007 at 02:37:47PM -0500, Jean-Luc Cooke wrote:
> > > Hello team,
> > >
> > > I tried to verify the following XML file (not a root'd web
> cert, sorry):
> > >
> [2]https://216.191.58.251/apache-xmlsec-help/Word-plugin-signature.
> xml
> > >
> > > Using the
> org.apache.xml.security.samples.signature.VerifySignature class
> that is found in src_samples directory and got this:
> > >
> > > java -cp
> .:../libs/xmlsec-1.3.0.jar:../libs/xalan.jar:../libs/commons-loggin
> g.jar org.apache.xml.security.samples.signature.VerifySignature
> Word-plugin-signature.xml
> > > Try to verify file: Word-plugin-signature.xml
> > > Could find a X509Data element in the KeyInfo
> > > Feb 21, 2007 2:20:17 PM
> org.apache.xml.security.signature.Reference verify
> > > INFO: Verification successful for URI "#idPackageObject"
> > > Feb 21, 2007 2:20:17 PM
> org.apache.xml.security.signature.Reference verify
> > > INFO: Verification successful for URI "#idOfficeObject"
> > > Feb 21, 2007 2:20:17 PM
> org.apache.xml.security.signature.Reference verify
> > > WARNING: Verification failed for URI "#idsigInvalidImage"
> > > Feb 21, 2007 2:20:17 PM
> org.apache.xml.security.signature.Reference verify
> > > WARNING: Verification failed for URI "#idsigValidImage"
> > > The XML signature in file
> file:/home/jlcooke/crypt_map/sc_data/sc/xmlsec/2007-02-21/Word-plug
> in-signature.xml is invalid !!!!! (bad)
> > > Object=
> > >
> > > It is clear the two Objects "#idsigInvalidImage"
> "#idsigValidImage" are failing.
> > >
> > > I have two questions:
> > > 1) How can I pragmatically find out why the signature failed
> verification?
> > > From what I can see the only way is to look at the log4j
> output.
> > > 2) Passing the XML file above into Aleksey's xmlsec1 app it
> passes. What's
> > > different?
> > >
> > > Thanks
> > >
> > > JLC
>
> --
> [3]http://r-bg.com
>
> References
>
> 1. mailto:[EMAIL PROTECTED]
> 2. https://216.191.58.251/apache-xmlsec-help/Word-plugin-signature.xml
> 3. http://r-bg.com/
Word-plugin-signature.xml
Description: application/xml
sig1.xml
Description: application/xml
/* * 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.signature; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.security.PublicKey; import java.security.cert.X509Certificate; import org.apache.xml.security.keys.KeyInfo; import org.apache.xml.security.samples.utils.resolver.OfflineResolver; import org.apache.xml.security.signature.XMLSignature; import org.apache.xml.security.utils.Constants; import org.apache.xml.security.utils.XMLUtils; import org.apache.xpath.XPathAPI; import org.w3c.dom.Element; /** * * * * * @author $Author: blautenb $ * */ public class VerifySignature { /** * Method main * * @param unused */ // public static void main(String unused[]) { public static void main(String arg[]) { boolean schemaValidate = false; final String signatureSchemaFile = "data/xmldsig-core-schema.xsd"; // String signatureFileName = "data/ie/baltimore/merlin-examples/merlin-xmldsig-fifteen/signature-enveloping-rsa.xml"; String signatureFileName = arg[0]; if (schemaValidate) { System.out.println("We do schema-validation"); } javax.xml.parsers.DocumentBuilderFactory dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance(); if (schemaValidate) { dbf.setAttribute("http://apache.org/xml/features/validation/schema", Boolean.TRUE); dbf.setAttribute( "http://apache.org/xml/features/dom/defer-node-expansion", Boolean.TRUE); dbf.setValidating(true); dbf.setAttribute("http://xml.org/sax/features/validation", Boolean.TRUE); } dbf.setNamespaceAware(true); dbf.setAttribute("http://xml.org/sax/features/namespaces", Boolean.TRUE); if (schemaValidate) { dbf.setAttribute( "http://apache.org/xml/properties/schema/external-schemaLocation", Constants.SignatureSpecNS + " " + signatureSchemaFile); } try { // File f = new File("signature.xml"); File f = new File(signatureFileName); System.out.println("Try to verify " + f.toURL().toString()); javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder(); db.setErrorHandler(new org.apache.xml.security.utils .IgnoreAllErrorHandler()); if (schemaValidate) { db.setEntityResolver(new org.xml.sax.EntityResolver() { public org.xml.sax.InputSource resolveEntity( String publicId, String systemId) throws org.xml.sax.SAXException { if (systemId.endsWith("xmldsig-core-schema.xsd")) { try { return new org.xml.sax.InputSource( new FileInputStream(signatureSchemaFile)); } catch (FileNotFoundException ex) { throw new org.xml.sax.SAXException(ex); } } else { return null; } } }); } org.w3c.dom.Document doc = db.parse(new java.io.FileInputStream(f)); Element nscontext = XMLUtils.createDSctx(doc, "ds", Constants.SignatureSpecNS); Element sigElement = (Element) XPathAPI.selectSingleNode(doc, "//ds:Signature[1]", nscontext); XMLSignature signature = new XMLSignature(sigElement, f.toURL().toString()); signature.addResourceResolver(new OfflineResolver()); // XMLUtils.outputDOMc14nWithComments(signature.getElement(), System.out); KeyInfo ki = signature.getKeyInfo(); if (ki != null) { if (ki.containsX509Data()) { System.out .println("Could find a X509Data element in the KeyInfo"); } X509Certificate cert = signature.getKeyInfo().getX509Certificate(); if (cert != null) { /* System.out.println( "I try to verify the signature using the X509 Certificate: " + cert); */ System.out.println("The XML signature in file " + f.toURL().toString() + " is " + (signature.checkSignatureValue(cert) ? "valid (good)" : "invalid !!!!! (bad)")); System.out.println("Object="+ (new String(signature.getBytesFromChildElement("Object","http://www.w3.org/2000/09/xmldsig#"))) ); } else { System.out.println("Did not find a Certificate"); PublicKey pk = signature.getKeyInfo().getPublicKey(); if (pk != null) { /* System.out.println( "I try to verify the signature using the public key: " + pk); */ System.out.println("The XML signature in file " + f.toURL().toString() + " is " + (signature.checkSignatureValue(pk) ? "valid (good)" : "invalid !!!!! (bad)")); } else { System.out.println( "Did not find a public key, so I can't check the signature"); } } } else { System.out.println("Did not find a KeyInfo"); } } catch (Exception ex) { ex.printStackTrace(); } } static { org.apache.xml.security.Init.init(); } }
= VERIFICATION CONTEXT == Status: invalid == flags: 0x00000001 == flags2: 0x00000000 == Id: "idPackageSignature" == Key Info Read Ctx: = KEY INFO READ CONTEXT == flags: 0x00000000 == flags2: 0x00000000 == enabled key data: all == RetrievalMethod level (cur/max): 0/1 == TRANSFORMS CTX (status=0) == flags: 0x00000000 == flags2: 0x00000000 == enabled transforms: all === uri: NULL === uri xpointer expr: NULL == EncryptedKey level (cur/max): 0/1 === KeyReq: ==== keyId: rsa ==== keyType: 0x00000001 ==== keyUsage: 0x00000002 ==== keyBitsSize: 0 === list size: 0 == Key Info Write Ctx: = KEY INFO WRITE CONTEXT == flags: 0x00000000 == flags2: 0x00000000 == enabled key data: all == RetrievalMethod level (cur/max): 0/1 == TRANSFORMS CTX (status=0) == flags: 0x00000000 == flags2: 0x00000000 == enabled transforms: all === uri: NULL === uri xpointer expr: NULL == EncryptedKey level (cur/max): 0/1 === KeyReq: ==== keyId: NULL ==== keyType: 0x00000001 ==== keyUsage: 0xffffffff ==== keyBitsSize: 0 === list size: 0 == Signature Transform Ctx: == TRANSFORMS CTX (status=2) == flags: 0x00000000 == flags2: 0x00000000 == enabled transforms: all === uri: NULL === uri xpointer expr: NULL === Transform: c14n (href=http://www.w3.org/TR/2001/REC-xml-c14n-20010315) === Transform: rsa-sha1 (href=http://www.w3.org/2000/09/xmldsig#rsa-sha1) === Transform: membuf-transform (href=NULL) == Signature Method: === Transform: rsa-sha1 (href=http://www.w3.org/2000/09/xmldsig#rsa-sha1) == Signature Key: == KEY === method: RSAKeyValue === key type: Public === key usage: -1 === rsa key: size = 1024 == SignedInfo References List: === list size: 4 = REFERENCE VERIFICATION CONTEXT == Status: succeeded == URI: "#idPackageObject" == Type: "http://www.w3.org/2000/09/xmldsig#Object" == Reference Transform Ctx: == TRANSFORMS CTX (status=2) == flags: 0x00000000 == flags2: 0x00000000 == enabled transforms: all === uri: === uri xpointer expr: #idPackageObject === Transform: xpointer (href=http://www.w3.org/2001/04/xmldsig-more/xptr) === Transform: c14n (href=http://www.w3.org/TR/2001/REC-xml-c14n-20010315) === Transform: sha1 (href=http://www.w3.org/2000/09/xmldsig#sha1) === Transform: membuf-transform (href=NULL) == Digest Method: === Transform: sha1 (href=http://www.w3.org/2000/09/xmldsig#sha1) = REFERENCE VERIFICATION CONTEXT == Status: succeeded == URI: "#idOfficeObject" == Type: "http://www.w3.org/2000/09/xmldsig#Object" == Reference Transform Ctx: == TRANSFORMS CTX (status=2) == flags: 0x00000000 == flags2: 0x00000000 == enabled transforms: all === uri: === uri xpointer expr: #idOfficeObject === Transform: xpointer (href=http://www.w3.org/2001/04/xmldsig-more/xptr) === Transform: c14n (href=http://www.w3.org/TR/2001/REC-xml-c14n-20010315) === Transform: sha1 (href=http://www.w3.org/2000/09/xmldsig#sha1) === Transform: membuf-transform (href=NULL) == Digest Method: === Transform: sha1 (href=http://www.w3.org/2000/09/xmldsig#sha1) = REFERENCE VERIFICATION CONTEXT == Status: succeeded == URI: "#idsigInvalidImage" == Type: "http://www.w3.org/2000/09/xmldsig#Object" == Reference Transform Ctx: == TRANSFORMS CTX (status=2) == flags: 0x00000000 == flags2: 0x00000000 == enabled transforms: all === uri: === uri xpointer expr: #idsigInvalidImage === Transform: xpointer (href=http://www.w3.org/2001/04/xmldsig-more/xptr) === Transform: c14n (href=http://www.w3.org/TR/2001/REC-xml-c14n-20010315) === Transform: sha1 (href=http://www.w3.org/2000/09/xmldsig#sha1) === Transform: membuf-transform (href=NULL) == Digest Method: === Transform: sha1 (href=http://www.w3.org/2000/09/xmldsig#sha1) = REFERENCE VERIFICATION CONTEXT == Status: succeeded == URI: "#idsigValidImage" == Type: "http://www.w3.org/2000/09/xmldsig#Object" == Reference Transform Ctx: == TRANSFORMS CTX (status=2) == flags: 0x00000000 == flags2: 0x00000000 == enabled transforms: all === uri: === uri xpointer expr: #idsigValidImage === Transform: xpointer (href=http://www.w3.org/2001/04/xmldsig-more/xptr) === Transform: c14n (href=http://www.w3.org/TR/2001/REC-xml-c14n-20010315) === Transform: sha1 (href=http://www.w3.org/2000/09/xmldsig#sha1) === Transform: membuf-transform (href=NULL) == Digest Method: === Transform: sha1 (href=http://www.w3.org/2000/09/xmldsig#sha1) == Manifest References List: === list size: 0
