[xmlsec] corrupt context after verify call
Aleksey Sanin
aleksey at aleksey.com
Wed Oct 13 09:29:24 PDT 2010
Sounds like you are compiling your application with different flags
compared to xmlsec. Something like structure members alignment
or debug vs. release.
Aleksey
On 10/13/10 7:32 AM, Erik Smith wrote:
> xmlsec output:
>
> OK
> SignedInfo References (ok/all): 1/1
> Manifests References (ok/all): 0/0
> = VERIFICATION CONTEXT
> == Status: succeeded
> == flags: 0x00000006
> == flags2: 0x00000000
> == 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: exc-c14n (href=http://www.w3.org/2001/10/xml-exc-c14n#)
> === 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
> === list size: 1
> === X509 Data:
> ==== Certificate:
> ==== Subject Name: /C=US/ST=TN/L=Nashville/O=Emdeon/OU=Emdeon/CN=Emdeon
> ==== Issuer Name: /C=US/ST=TN/L=Nashville/O=Emdeon/OU=Emdeon/CN=Emdeon
> ==== Issuer Serial: 4CAB2D3B
> == SignedInfo References List:
> === list size: 1
> = REFERENCE VERIFICATION CONTEXT
> == Status: succeeded
> == URI: "#Response-guid-ab3e423b-4f6e-4376-b910-553b31bc6404"
> == Reference Transform Ctx:
> == TRANSFORMS CTX (status=2)
> == flags: 0x00000000
> == flags2: 0x00000000
> == enabled transforms: all
> === uri:
> === uri xpointer expr: #Response-guid-ab3e423b-4f6e-4376-b910-553b31bc6404
> === Transform: xpointer (href=http://www.w3.org/2001/04/xmldsig-more/xptr)
> === Transform: enveloped-signature
> (href=http://www.w3.org/2000/09/xmldsig#enveloped-signature)
> === Transform: exc-c14n (href=http://www.w3.org/2001/10/xml-exc-c14n#)
> === Transform: membuf-transform (href=NULL)
> === 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)
> == PreDigest data - start buffer:
> <Response xmlns="urn:oasis:names:tc:SAML:1.0:protocol"
> xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
> xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> IssueInstant="2010-10-06T21:15:38.906Z" MajorVersion="1"
> MinorVersion="1" Recipient="http://amgr.emdeon.com"
> ResponseID="Response-guid-ab3e423b-4f6e-4376-b910-553b31bc6404"><Status><StatusCode
> Value="samlp:Success"></StatusCode></Status><Assertion
> xmlns="urn:oasis:names:tc:SAML:1.0:assertion"
> AssertionID="kpenti-df8fac42-ac9d-4317-98c4-7c05fc4bb761"
> IssueInstant="2010-10-06T16:15:38.906Z"
> Issuer="http://access.emdeon.com" MajorVersion="1"
> MinorVersion="1"><Conditions NotBefore="2010-10-06T21:15:38.905Z"
> NotOnOrAfter="2010-10-06T21:25:38.905Z"></Conditions><AuthenticationStatement
> AuthenticationInstant="2010-10-06T16:15:38.906Z"
> AuthenticationMethod="urn:oasis:names:tc:1.0:am:password"><Subject><NameIdentifier>kpenti</NameIdentifier><SubjectConfirmation><ConfirmationMethod>urn:oasis:names:tc:1.0:cm:bearer</ConfirmationMethod></SubjectConfirmation></Subject></AuthenticationStatement></Assertion></Response>
> == PreDigest data - end buffer
> == Manifest References List:
> === list size: 0
>
>
> On Wed, Oct 13, 2010 at 7:28 AM, Aleksey Sanin <aleksey at aleksey.com
> <mailto:aleksey at aleksey.com>> wrote:
>
> What is the output of the xmlsec1 command?
>
> Aleksey
>
>
> On 10/12/10 11:36 PM, Erik Smith wrote:
>
> After I call xmlSecDSigCtxVerify, the status in the contex is
> corrupted
> with a large number. However xmlsec1 reports validation as OK.
>
> xmlsec1 --verify --pubkey-cert-pem cert.crt --store-references
> --id-attr:ResponseID
> urn:oasis:names:tc:SAML:1.0:protocol:Response /saml.xml
>
> Also xmlSecDSigCtxDebugDump output is exactly the same for
> xmlsec1 and
> my program.
>
> I've reduced the code down to what is below and I'm having trouble
> seeing what could be wrong.
>
> libxml version: 2.6.27
> xmlsec version: 1.2.11
>
> Thanks for any help.
>
>
>
> #include <iostream>
> #include <xmlsec/xmltree.h>
> #include <xmlsec/xmldsig.h>
> #include <xmlsec/crypto.h>
> #include <xmlsec/errors.h>
>
> #ifndef XMLSEC_NO_XSLT
> #include <libxslt/xslt.h>
> #endif
>
> void error(const char *);
>
> int main(int argc, char **argv) {
> using namespace std;
> int status(0);
>
> xmlSecKeysMngrPtr mngr_;
> xmlSecDSigCtxPtr dsigCtx;
> xmlDocPtr doc_;
>
> cout << "libxml version: " << LIBXML_DOTTED_VERSION << endl;
> cout << "xmlsec version: " << XMLSEC_VERSION << endl;
>
> xmlInitParser();
> LIBXML_TEST_VERSION;
> xmlLoadExtDtdDefaultValue = XML_DETECT_IDS |
> XML_COMPLETE_ATTRS;
> xmlSubstituteEntitiesDefault(1);
>
> #ifndef XMLSEC_NO_XSLT
> xmlIndentTreeOutput = 1;
> #endif
> // Init xmlsec library
> if (xmlSecInit() < 0) error("xmlSecInit");
> if (xmlSecCheckVersion() != 1) error("xmlSecCheckVersion");
>
> #ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING
> if(xmlSecCryptoDLLoadLibrary(BAD_CAST "openssl") < 0)
> error("xmlSecCryptoDLLoadLibrary");
> #endif
>
> if(xmlSecCryptoAppInit(NULL) < 0) error("Error: crypto
> initialization failed.");
> if(xmlSecCryptoInit() < 0) error("Error: xmlsec-crypto
> initialization failed.");
>
> mngr_ = xmlSecKeysMngrCreate();
> if (!mngr_) error("bad");
>
> if (xmlSecCryptoAppDefaultKeysMngrInit(mngr_) < 0)
> error("bad");
>
> xmlSecKeyDataFormat format(xmlSecKeyDataFormatCertPem);
> xmlSecKeyPtr key = xmlSecCryptoAppKeyLoad("cert.crt",
> format, NULL,
> NULL, NULL);
> if (!key) error("key load error");
>
> if(xmlSecCryptoAppDefaultKeysMngrAdoptKey(mngr_, key) < 0)
> error("could not add key");
>
> doc_ = xmlParseFile("saml.xml");
> if (!doc_ || !xmlDocGetRootElement(doc_)) error("bad");
>
> set_id(doc_);
>
> xmlNodePtr node = xmlSecFindNode(xmlDocGetRootElement(doc_),
> xmlSecNodeSignature, xmlSecDSigNs);
> if (!node) error("start node not found");
>
> dsigCtx = xmlSecDSigCtxCreate(mngr_);
> if (!dsigCtx) error("failed to create signature context");
>
> std::cout << "status before: " << dsigCtx->status << std::endl;
> if (xmlSecDSigCtxVerify(dsigCtx, node) < 0)
> error("signature verify
> error");
> std::cout << "status: " << dsigCtx->status << std::endl;
> //xmlSecDSigCtxDebugDump(dsigCtx, stdout);
>
> return status;
> }
>
> void set_id(xmlDocPtr doc) {
> using namespace std;
>
> xmlNodePtr node = xmlSecFindNode(
> xmlDocGetRootElement(doc),
> BAD_CAST "Response",
> BAD_CAST "urn:oasis:names:tc:SAML:1.0:protocol");
>
> cout << "element name: " << node->name<< endl;
> xmlAttrPtr attr = xmlHasProp(node, BAD_CAST "ResponseID");
> if (!attr) error("attribute not found");
> cout << "attribute name: " << attr->name<< endl;
>
> xmlChar *value = xmlNodeListGetString(node->doc,
> attr->children, 1);
> if (!value) error("xmlNodeListGetString");
> cout << "value: " << value << endl;
>
> xmlAttrPtr tmp(xmlGetID(node->doc, value));
> if (tmp) {
> cout << "id already registered" << endl;
> } else {
> xmlIDPtr id = xmlAddID(NULL, doc, BAD_CAST value, attr);
> if (!id) {
> xmlFree(value); // fix
> error("xmlAddID error");
> }
> cout << "id added" << endl;
> }
>
> //xmlFree(value); // fix
> }
>
> void error(const char *e) {
> std::cout << e << std::endl;
> std::cout << "exiting" << std::endl;
> exit(0);
> }
>
>
>
>
>
>
>
>
> _______________________________________________
> xmlsec mailing list
> xmlsec at aleksey.com <mailto:xmlsec at aleksey.com>
> http://www.aleksey.com/mailman/listinfo/xmlsec
>
>
More information about the xmlsec
mailing list