[xmlsec] Verifying signature for enveloped signature with multiple signatures

Magnus R magnus_qwerty at hotmail.com
Tue Dec 18 07:20:05 PST 2012


Hello again, 

I made a mistake in the question:

It is not the call to xmlSecDSigCtxCreate() that fails. 
Instead, it is the call to xmlSecDSigCtxVerify() that fails. 



Here is the code:
==============

    std::cout << "Will find start node" << std::endl;

    // find start node
    xmlNodePtr node = xmlSecFindNode(xmlDocGetRootElement(doc), xmlSecNodeSignature, xmlSecDSigNs);
    if(node == NULL)
    {
        throw std::string("Start node not found in XML file");
    }

    std::cout << "-Found this node: \"" << node->name << "\"" << std::endl;

    // create signature context
    xmlSecDSigCtxPtr dsigCtx = xmlSecDSigCtxCreate(mngr);
    if(dsigCtx == NULL)
    {
        throw std::string("failed to create signature context");
    }

    std::cout << "Will verify signature" << std::endl;

    // Verify signature
    if(xmlSecDSigCtxVerify(dsigCtx, node) < 0)
    {
        fprintf(stderr,"Error: signature verify\n");
        return false;
    }

===============================

Regards
/Magnus


From: magnus_qwerty at hotmail.com
To: xmlsec at aleksey.com
Date: Tue, 18 Dec 2012 14:37:38 +0100
Subject: [xmlsec] Verifying signature for enveloped signature with multiple	signatures




Hello, 
I have a question regarding signature verification for enveloped signatures.
The question seems related to previous discussions in the forum:

http://www.aleksey.com/pipermail/xmlsec/2010/008910.html
http://www.aleksey.com/pipermail/xmlsec/2010/008911.html
http://www.aleksey.com/pipermail/xmlsec/2012/009340.html
http://www.aleksey.com/pipermail/xmlsec/2012/009341.html

But even with help of the previous posts I have not been able to verify my xml file.
I have tried the command line application "xmlsec1", as well as writing code, 
but it seems the same problem happens in both cases, so I will show the code below,
which is similar to the "verify3.c" example application shipped with the xmlsec library.


The relevant code part looks like this (written in C++):
==================================================
    std::cout << "Will find start node" << std::endl;

    // find start node
    xmlNodePtr node = xmlSecFindNode(xmlDocGetRootElement(doc), xmlSecNodeSignature, xmlSecDSigNs);
    if(node == NULL)
    {
        throw std::string("Start node not found in XML file");
    }

    std::cout << "-Found this node: \"" << node->name << "\"" << std::endl;

    // create signature context
    xmlSecDSigCtxPtr dsigCtx = xmlSecDSigCtxCreate(mngr);
    if(dsigCtx == NULL)
    {
        throw std::string("failed to create signature context");
    }
==================================================


When I run the application i get the following output:

-----------------------------------
Will verify file
Will load file: signedmod.xml
Will find start node
-Found this node: "Signature"
Will verify signature
func=xmlSecXPathDataExecute:file=xpath.c:line=273:obj=unknown:subj=xmlXPtrEval:error=5:libxml2 library function failed:expr=xpointer(id('SignedRouting'))
func=xmlSecXPathDataListExecute:file=xpath.c:line=356:obj=unknown:subj=xmlSecXPathDataExecute:error=1:xmlsec library function failed: 
func=xmlSecTransformXPathExecute:file=xpath.c:line=466:obj=xpointer:subj=xmlSecXPathDataExecute:error=1:xmlsec library function failed: 
func=xmlSecTransformDefaultPushXml:file=transforms.c:line=2395:obj=xpointer:subj=xmlSecTransformExecute:error=1:xmlsec library function failed: 
func=xmlSecTransformCtxXmlExecute:file=transforms.c:line=1226:obj=unknown:subj=xmlSecTransformPushXml:error=1:xmlsec library function failed:transform=xpointer
func=xmlSecTransformCtxExecute:file=transforms.c:line=1286:obj=unknown:subj=xmlSecTransformCtxXmlExecute:error=1:xmlsec library function failed: 
func=xmlSecDSigReferenceCtxProcessNode:file=xmldsig.c:line=1571:obj=unknown:subj=xmlSecTransformCtxExecute:error=1:xmlsec library function failed: 
func=xmlSecDSigCtxProcessSignedInfoNode:file=xmldsig.c:line=804:obj=unknown:subj=xmlSecDSigReferenceCtxProcessNode:error=1:xmlsec library function failed:node=Reference
func=xmlSecDSigCtxProcessSignatureNode:file=xmldsig.c:line=547:obj=unknown:subj=xmlSecDSigCtxProcessSignedInfoNode:error=1:xmlsec library function failed: 
func=xmlSecDSigCtxVerify:file=xmldsig.c:line=366:obj=unknown:subj=xmlSecDSigCtxSigantureProcessNode:error=1:xmlsec library function failed: 
Error: signature verify
-----------------------------------


The XML input XML file is shown at the end of this email. 
(also see the attached file signedxml.xml)


As can be seen from the output, the call to xmlSecFindNode() succeeds, and the node found is "Signature":
      -Found this node: "Signature"

However, after this the call to xmlSecDSigCtxCreate() fails. 

My guess it that first the "Signature" node is (correctly) found, 
but since this is an enveloped signature rather than an enveloping signature, the call fails. 

I have looked through the example XML files at the xmlsec online verifier web page:
http://www.aleksey.com/xmlsec/xmldsig-verifier.html

In those examples, the "Signature" tag is the outermost tag, with everything else contained in it.
However, in my case, the "Signature" tag is embedded in other tags that should be included in the signature. 

I guess the problem is that the "Signature" tag is found, but not everything needed to verify the
signature is contained in that tag. Instead, some information is outside of the tag.

So the question is, how should I solve this? 
Can you give some hints how I should implement the signature verification for my XML document?

The XML document will always have the same structure/XML schema, so it would be possible to
hard code search paths etc rather than making the solution generic enough for all kinds of documents. 


Regards
/Magnus




+++++++++++++++++++++++++++++++++
<soap:Envelope xmlns:myapp="http://www.mycompany.com/myapp" xmlns:soap="http://www.w3.org/2001/12/soap-envelope">
  <soap:Header>
    <myapp:Routing Filename="testfile.docx" ID="SignedRouting">
      <myapp:Transforms>
        <myapp:Transform Order="1" Type="Base64"></myapp:Transform>
      </myapp:Transforms>
    </myapp:Routing>
    <myapp:MyWorker ID="SignedMyWorker"></myapp:MyWorker>
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
      <Reference URI="#SignedRouting">
       <Transforms>
         <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
       </Transforms>
       <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
       <DigestValue>RHhNanfgz950DdpZUZeX3zNdvmY=</DigestValue>
      </Reference>

      <Reference URI="#SignedBody">
       <Transforms>
        <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
       </Transforms>
       <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
       <DigestValue>jdfsfsdlfkjsdflkjsdflkjdsf</DigestValue>
      </Reference>
     </SignedInfo>
   <SignatureValue>poisdufsoifusdofiusdoifusdfpuidsf</SignatureValue>
   <KeyInfo>
     <KeyValue>
       <RSAKeyValue>
         <Modulus>ksfhsdkhfsdkjfhskdhf</Modulus>
         <Exponent>AQAB</Exponent>
       </RSAKeyValue>
     </KeyValue></KeyInfo>
    </Signature>
   </soap:Header>
  <soap:Body ID="SignedBody">
    <myapp:FileData>
      <![CDATA[UEIUYIUYUIYUIYUIYUIY
]]>
    </myapp:FileData>
  </soap:Body>
</soap:Envelope>
+++++++++++++++++++++++++++++++++

 		 	   		  

_______________________________________________
xmlsec mailing list
xmlsec at aleksey.com
http://www.aleksey.com/mailman/listinfo/xmlsec 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.aleksey.com/pipermail/xmlsec/attachments/20121218/7bf5bad1/attachment-0001.html>


More information about the xmlsec mailing list