Thanks! Great to know!

Aleksey

On 2/10/2010 9:25 PM, mahendra N wrote:
Hi Aleksey,
                 We were able to sort out the problem. We had to compile
our program with
XMLSEC_NO_SIZE_T flag before porting it to MIPS 64 bit system. Thanks
for all your time Aleksey.
Thanks and Regards,
Mahendra Naik

2010/2/4 mahendra N <[email protected] <mailto:[email protected]>>

    Hi,
             What should the function return. 0 or -1? Is the code piece
    right..?..
    Thanks an Regards,
    Mahendra Naik


    2010/2/4 Aleksey Sanin <[email protected]
    <mailto:[email protected]>>

        Ah, OK. I was looking at the other place.

        Aleksey


        On 2/3/2010 11:03 PM, mahendra N wrote:

            Hi,

            I have attached some comments inline

            Thanks and Regards,
            Mahendra Naik

            2010/2/4 Aleksey Sanin <[email protected]
            <mailto:[email protected]> <mailto:[email protected]
            <mailto:[email protected]>>>


                See my answers inline.

                Aleksey



                On 2/3/2010 10:15 PM, mahendra N wrote:

                    Hi Aleksey,

                                 In /xmlSecDSigCtxVerify/ there are
            calls to two
                    functions
                    /xmlSecDSigCtxProcessSignatureNode/ and
                    /xmlSecTransformVerifyNodeContent/
                    / After the call to
            x/mlSecDSigCtxProcessSignatureNode /there is
                    a check

                    placed for /
                    /      dSigCtx->status!=xmlSecDSigStatusUnknown .If
            there is a
                    success
                    then the function returns 0. Is this check
            absolutely necessary
                    at that
                    point in the code?. Because when we comment the
            check and proceed
                    further, then /xmlSecTransformVerifyNodeContent
            /returns -1 for
                    any XML
                    file that is tampered./


                [Aleksey] The check there returns -1 if the status is
            NOT equal to
                xmlSecDSigStatusUnknown. This is a check to make sure
            that we don't
                have unexpected state in the signature. One of the
            possible cases where
                it might happen is if you are re-using the *same*
            xmlDsigCtx for
                multiple signatures w/o calling xmlSecDSigCtxFinalize().

            The check returns 0 not -1.
                I am attaching the code piece here.I've marked the
            concerned part in
            bold.
              int xmlSecDSigCtxVerify(xmlSecDSigCtxPtr dsigCtx,
            xmlNodePtr node) {
                 int ret;

                 xmlSecAssert2(dsigCtx != NULL, -1);
                 xmlSecAssert2(node != NULL, -1);
                 xmlSecAssert2(node->doc != NULL, -1);

                 /* add ids for Signature nodes */
                 dsigCtx->operation  = xmlSecTransformOperationVerify;
                 dsigCtx->status     = xmlSecDSigStatusUnknown;
                 xmlSecAddIDs(node->doc, node, xmlSecDSigIds);

                 /* read siganture info */
                 ret = xmlSecDSigCtxProcessSignatureNode(dsigCtx, node);
                 if(ret < 0) {
                     xmlSecError(XMLSEC_ERRORS_HERE,
                                 NULL,
            "xmlSecDSigCtxSigantureProcessNode",
                                 XMLSEC_ERRORS_R_XMLSEC_FAILED,
                                 XMLSEC_ERRORS_NO_MESSAGE);
                     return(-1);
                 }
                 xmlSecAssert2(dsigCtx->signMethod != NULL, -1);
                 xmlSecAssert2(dsigCtx->signValueNode != NULL, -1);

                 /* references processing might change the status */
            *if(dsigCtx->status != xmlSecDSigStatusUnknown) {*
            *        return(0); *
            *    }*

                 /* verify SignatureValue node content */
                 ret = xmlSecTransformVerifyNodeContent(dsigCtx->signMethod,
            dsigCtx->signValueNode,
            &(dsigCtx->transformCtx));
                 if(ret < 0) {
                     xmlSecError(XMLSEC_ERRORS_HERE,
                                 NULL,
            "xmlSecTransformVerifyNodeContent",
                                 XMLSEC_ERRORS_R_XMLSEC_FAILED,
                                 XMLSEC_ERRORS_NO_MESSAGE);
                     return(-1);
                 }

                 /* set status and we are done */
                 if(dsigCtx->signMethod->status ==
            xmlSecTransformStatusOk) {
                     dsigCtx->status = xmlSecDSigStatusSucceeded;
                 } else {
                     dsigCtx->status = xmlSecDSigStatusInvalid;
                 }
                 return(0);
            }



                    /
                    /
                    /
                    /
                    /And I tried with purify tool, there was no memory
            corruption
                    reported/

                    /./
                    /Aleksey the system where this error is reproduced
            is a 64-bit, MIPS
                    architecture ,Windriver linux/
                    /
                    /
                    /.Are there any specific compiler flags to be set
            for the above
                    mentioned configuration./
                    /

                [Aleksey] No idea. Never used such a setup.

                    /
                    /

                    /
                    Some more investigation that was done:
                    (i) The unpredictable behaviour  is due to mismatch
            of memory
                    location
                    of status member of the structure struct xmlSecDSigCtx.
                    (ii) I tried to get the adress of each of the member
            variable of
                    structure xmlSecDSigCtx. Please find it below.
                    Inside the ImplLibXml(our local file)

                      dsigCtx Address ( 4832286288) + size (8)
                    Address of userData(4832286288) + size(8)
                    Address of flags(4832286296) + size(4)
                    Address of flags2(4832286300) + size(4)
                    Address of keyInfoReadCtx(4832286304) + size(368)
                    Address of keyInfoWriteCtx(4832286672) + size(368)
                    Address of transformCtx(4832287040) + size(136)
                    Address of enabledReferenceUris(4832287176) + size(4)
                    Address of enabledReferenceTransforms(4832287184) +
            size(8)
                    Address of referencePreExecuteCallback(4832287192) +
            size(8)
                    Address of defSignMethodId(4832287200) + size(8)
                    Address of defC14NMethodId(4832287208) + size(8)
                    Address of defDigestMethodId(4832287216) + size(8)
                    Address of signKey(4832287224) + size(8)
                    Address of operation(4832287232) + size(4)
                    Address of result(4832287240) + size(8)
                    Address of status(4832287248) + size(4)
                    Address of signMethod(4832287256) + size(8)
                    Address of preSignMemBufMethod(4832287272) + size(8)
                    Address of signValueNode(4832287280) + size(8)
                    Address of id(4832287288) + size(8)
                    Address of signedInfoReferences(4832287296) + size(40)
                    Address of manifestReferences(4832287336) + size(40)
                    Address of reserved0(4832287376) + size(8)
                    Address of reserved1(4832287384) + size(8)

                    ImplLibXml **END**

                    Inside xmlsec

                    dsigCtx Address ( 4832286288) + size (8)
                    Address of userData(4832286288) + size(8)
                    Address of flags(4832286296) + size(4)
                    Address of flags2(4832286300) + size(4)
                    Address of keyInfoReadCtx(4832286304) + size(344)
                    Address of keyInfoWriteCtx(4832286648) + size(344)
                    Address of transformCtx(4832286992) + size(128)
                    Address of enabledReferenceUris(4832287120) + size(4)
                    Address of enabledReferenceTransforms(4832287128) +
            size(8)
                    Address of referencePreExecuteCallback(4832287136) +
            size(8)
                    Address of defSignMethodId(4832287144) + size(8)
                    Address of defC14NMethodId(4832287152) + size(8)
                    Address of defDigestMethodId(4832287160) + size(8)
                    Address of signKey(4832287168) + size(8)
                    Address of operation(4832287176) + size(4)
                    Address of result(4832287184) + size(8)
                    Address of status(4832287192) + size(4)
                    Address of signMethod(4832287200) + size(8)
                    Address of preSignMemBufMethod(4832287216) + size(8)
                    Address of signValueNode(4832287224) + size(8)
                    Address of id(4832287232) + size(8)
                    Address of signedInfoReferences(4832287240) + size(32)
                    Address of manifestReferences(4832287272) + size(32)
                    Address of reserved0(4832287304) + size(8)
                    Address of reserved1(4832287312) + size(8)

                    xmlSecDSigCtxVerify****************END**********

                    Please observe that the main culprit for mismatch of
            memory
                    location are
                    three user defined data members
                    Address of keyInfoReadCtx(4832286304) + size(368) --
            more 24 bytes
                    Address of keyInfoWriteCtx(4832286672) + size(368)
            -- more 24 bytes
                    Address of transformCtx(4832287040) + size(136)
            -- more 8 bytes.

                    But I find the consistency in case of status member
            is that the
                    difference of location (i.e. between the status
            member in xmlsec
                    and in
                    ImplLibXml )is always 56 bytes as above the memory
            difference is
                    also 56
                    bytes.I feel issue on MIPS is somehow related to
            memory mapping
                    issues.


                [Aleksey] Bingo! As I said, it feels like you have a problem
                with compiler flags. Check data alignment related flags
            for xmlsec
                compilation vs. your program compilation. This obviously
            explains
                why you can't reproduce this problem with xmlsec command
            line tool.




_______________________________________________
xmlsec mailing list
[email protected]
http://www.aleksey.com/mailman/listinfo/xmlsec

Reply via email to