There are lots of known problem associated with exsiting XML 
signature/encryption specs... w3c is 
currently revising those specs to improve usability and performance
  ----- Original Message ----- 
  From: [EMAIL PROTECTED] 
  To: security-dev@xml.apache.org 
  Sent: Tuesday, August 05, 2008 8:35 AM
  Subject: Re: Signature verification issue



  > transformer.setOutputProperty(OutputKeys.INDENT, "no"); 
  Hmmm, I had indent set to no 

  So I tried removing this: 
  > transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount";, 
"4"); 

  Same results. 

  Also, isn't the Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS supposed to 
account for the differences in spaces?


  Edward Thompson

  (704) 383-9933
  401 South Tryon Street
  Three Wachovia Center, Sixth floor
  Charlotte, NC 28202

  Authentication & Entitlements 



        "Raul Benito" <[EMAIL PROTECTED]> 
        Sent by: [EMAIL PROTECTED] 
        08/05/2008 11:19 AM Please respond to
              security-dev@xml.apache.org 


       To security-dev@xml.apache.org  
              cc  
              Subject Re: Signature verification issue 

              

       



  Ok what are you doing is adding spaces as you are indenting the
  result, as space is a relevant content you are destroying the
  signature in the process. You have to output it as pure as possible,
  in xml-sec there some of them but any that don't add spaces will work.

  Regards,
  Raul

  On Tue, Aug 5, 2008 at 7:26 AM,  <[EMAIL PROTECTED]> wrote:
  >
  > OK, so I have tried serializing and (re)parsing the XML message first, but
  > still fail the verification:
  >
  >                 Document doc = assertion.getOwnerDocument();
  >                 doc.normalize();
  >                 // somehow the ID attribute is not yet really in the doc
  >                 // so we regsiter the id of interest so the Resolver called
  > by sign can
  >                 // find it
  >                 String assertionId =
  > assertion.getAttributeNode("ID").toString().substring(4,37);
  >                 IdResolver.registerElementById(assertion, assertionId);
  >
  >                 XMLSignature sig = new XMLSignature(doc, "",
  >
  > 
XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1,Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
  >
  > assertion.insertBefore(sig.getElement(),assertion.getFirstChild());
  >
  >                 // create the transforms object for the Document/Reference
  >                 Transforms transforms = new Transforms(doc);
  >
  >                 // First we have to strip away the signature element (it's
  > not part of
  >                 // the signature calculations). The enveloped transform can
  > be used.
  >
  > transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
  >                 // Part of the signature element needs to be canonicalized.
  > It is a kind
  >                 // of normalizing algorithm for XML. For more information
  > please take a
  >                 // look at the W3C XML Digital Signature webpage.
  >                                  InclusiveNamespaces incNS = new
  > InclusiveNamespaces(doc, "ds saml xenc xs");
  >
  >
  > 
transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS,incNS.getElement());
  >                 // Add the above Document/Reference
  >                 sig.addDocument("#"+assertionId, transforms,
  > Constants.ALGO_ID_DIGEST_SHA1);
  >
  >                 Key privKey = (Key) cred.get("privateKey");
  >                 sig.sign(privKey);
  >
  >                 try {
  >                         // /
  > TEST!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  >                         StringWriter writer = new StringWriter();
  >
  >                         TransformerFactory transformerFactory =
  > TransformerFactory
  >                                         .newInstance();
  >                         Transformer transformer = null;
  >
  >                         transformer = transformerFactory.newTransformer();
  >
  >                         transformer.setOutputProperty(OutputKeys.METHOD,
  > "xml");
  >                         transformer.setOutputProperty(OutputKeys.VERSION,
  > "2.0");
  >
  > transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,"yes");
  >                         transformer.setOutputProperty(OutputKeys.ENCODING,
  > "ISO-8859-1");
  >
  > transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount";,
  > "4");
  >                         transformer.setOutputProperty(OutputKeys.INDENT,
  > "no");
  >
  >
  >                         transformer.transform(new DOMSource(doc), new
  > StreamResult(writer));
  >
  >
  >                         DOMParser parser = new DOMParser();
  >                         InputSource input = new InputSource(new
  > BufferedInputStream(
  >                                         new
  > ByteArrayInputStream(writer.toString().getBytes())));
  >                         input.setEncoding("ISO-8859-1");
  >                         parser.parse(input);
  >
  >                         Document doc2 = parser.getDocument();
  >
  >                         XPathFactory xFact = XPathFactory.newInstance();
  >                         XPath xpath = xFact.newXPath();
  >                         SimpleNamespaceContext snc = new
  > SimpleNamespaceContext();
  >                         snc.addNamespace("SOAP-ENV",
  >
  > "http://schemas.xmlsoap.org/soap/envelope/";);
  >                         snc.addNamespace("ws",
  >
  > "http://schemas.xmlsoap.org/ws/2005/02/trust";);
  >                         snc.addNamespace("saml",
  > "urn:oasis:names:tc:SAML:2.0:assertion");
  >                         snc.addNamespace("ds",
  > "http://www.w3.org/2000/09/xmldsig#";);
  >                         xpath.setNamespaceContext(snc);
  >                         XPathExpression expr = null;
  >
  >                         expr = xpath
  >
  > .compile("//saml:Assertion/ds:Signature");
  >
  >                         Element sigElement = null;
  >
  >                         sigElement = (Element) expr.evaluate(doc2,
  > XPathConstants.NODE);
  >
  >                         XMLSignature signature = null;
  >
  >                         signature = new XMLSignature(sigElement, "");
  >
  >                         boolean isSuccess =
  > signature.checkSignatureValue((Key) cred
  >                                         .get("publicKey"));
  >                         LogManager.debug("First verification = " +
  > isSuccess);
  >                 } catch (Exception e) {
  >                         e.printStackTrace();
  >                         throw e;
  >                 }
  >
  > Is anything wrong with how I am doing that that would impact the results?
  >
  >
  >
  > "Raul Benito" <[EMAIL PROTECTED]>
  > Sent by: [EMAIL PROTECTED]
  >
  > 08/05/2008 06:33 AM
  >
  > Please respond to
  > security-dev@xml.apache.org
  > To
  > security-dev@xml.apache.org
  > cc
  > Subject
  > Re: Signature verification issue
  >
  >
  >
  >
  > You have to serialize the signature and deserialize it sadly the
  > internal structures doesn't manage signing and verifying and the same
  > time.
  >
  > On Mon, Aug 4, 2008 at 1:42 PM,  <[EMAIL PROTECTED]> wrote:
  >>
  >> I am trying to create, then verify a signature, without much success.  I
  >> assume something I am doing is corrupting the XML, so I chnaged the code
  >> to
  >> call checkSignatureValue() immediately after calling sign():
  >>
  >>                 Document doc = assertion.getOwnerDocument();
  >>                 doc.normalize();
  >>                 // somehow the ID attribute is not yet really in the doc
  >>                 // so we regsiter the id of interest so the Resolver
  >> called
  >> by sign can
  >>                 // find it
  >>                 String assertionId =
  >> assertion.getAttributeNode("ID").toString().substring(4,37);
  >>                 IdResolver.registerElementById(assertion, assertionId);
  >>
  >>                 XMLSignature sig = new XMLSignature(doc, "",
  >>
  >>
  >> 
XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1,Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
  >>
  >> assertion.insertBefore(sig.getElement(),assertion.getFirstChild());
  >>
  >>                 // create the transforms object for the Document/Reference
  >>                 Transforms transforms = new Transforms(doc);
  >>
  >>                 // First we have to strip away the signature element (it's
  >> not part of
  >>                 // the signature calculations). The enveloped transform
  >> can
  >> be used.
  >>
  >> transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
  >>                 // Part of the signature element needs to be
  >> canonicalized.
  >> It is a kind
  >>                 // of normalizing algorithm for XML. For more information
  >> please take a
  >>                 // look at the W3C XML Digital Signature webpage.
  >>                     InclusiveNamespaces incNS = new
  >> InclusiveNamespaces(doc,
  >> "ds saml xenc xs");
  >>
  >>
  >>
  >> 
transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS,incNS.getElement());
  >>                 // Add the above Document/Reference
  >>                 sig.addDocument("#"+assertionId, transforms,
  >> Constants.ALGO_ID_DIGEST_SHA1);
  >>
  >>                 Key privKey = (Key) cred.get("privateKey");
  >>                 sig.sign(privKey);
  >>
  >>                     boolean isSuccess =  sig.checkSignatureValue(<public
  >> key>);
  >>                    LogManager.debug("First verification = " + isSuccess);
  >>
  >>       The call to sig.checkSignatureValue () fails.  Can anyone help
  >> explain
  >> why?  If I understand this, I am hoping I will better understand how to
  >> make
  >> the the rest work.
  >>
  >> Ed
  >
  >

Reply via email to