> 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