blautenb    2003/05/31 15:55:08

  Modified:    c/src/tools/xtest xtest.cpp
  Log:
  Memory checks now performed
  
  Revision  Changes    Path
  1.14      +367 -300  xml-security/c/src/tools/xtest/xtest.cpp
  
  Index: xtest.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/tools/xtest/xtest.cpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- xtest.cpp 28 May 2003 10:56:48 -0000      1.13
  +++ xtest.cpp 31 May 2003 22:55:08 -0000      1.14
  @@ -284,6 +284,24 @@
   
   int main(int argc, char **argv) {
   
  +     /* We output a version number to overcome a "feature" in Microsoft's 
memory
  +        leak detection */
  +
  +     cout << "DSIG Info (Using Apache XML-Security-C Library v" << 
XSEC_VERSION_MAJOR <<
  +             "." << XSEC_VERSION_MEDIUM << "." << XSEC_VERSION_MINOR << 
")\n";
  +
  +#if defined (_DEBUG) && defined (_MSC_VER)
  +
  +     // Do some memory debugging under Visual C++
  +
  +     _CrtMemState s1, s2, s3;
  +
  +     // At this point we are about to start really using XSEC, so
  +     // Take a "before" checkpoing
  +
  +     _CrtMemCheckpoint( &s1 );
  +
  +#endif
   
        // First initialise the XML system
   
  @@ -305,401 +323,450 @@
   
        }
   
  -     /*
  -      * First we create a document from scratch
  -      */
  -
  -     cerr << "Creating a known doc and signing (HMAC-SHA1)" << endl;
  -     
  -     // Create a blank Document
  -
  -    //DOMImplementation impl;
  -
  -     XMLCh tempStr[100];
  -    XMLString::transcode("Core", tempStr, 99);    
  -    DOMImplementation *impl = 
DOMImplementationRegistry::getDOMImplementation(tempStr);
  -        
  -
  -    DOMDocument *doc = impl->createDocument(
  -                0,                    // root element namespace URI.
  -                MAKE_UNICODE_STRING("ADoc"),            // root element name
  -                NULL);// DOMDocumentType());  // document type object (DTD).
  -
  -    DOMElement *rootElem = doc->getDocumentElement();
  -     rootElem->setAttributeNS(DSIGConstants::s_unicodeStrURIXMLNS, 
  -             MAKE_UNICODE_STRING("xmlns:foo"), 
MAKE_UNICODE_STRING("http://www.foo.org";));
  -
  -    DOMElement  * prodElem = 
doc->createElement(MAKE_UNICODE_STRING("product"));
  -    rootElem->appendChild(prodElem);
  -
  -    DOMText    * prodDataVal = 
doc->createTextNode(MAKE_UNICODE_STRING("XMLSecurityC"));
  -    prodElem->appendChild(prodDataVal);
  -
  -    DOMElement  *catElem = 
doc->createElement(MAKE_UNICODE_STRING("category"));
  -    rootElem->appendChild(catElem);
  -    catElem->setAttribute(MAKE_UNICODE_STRING("idea"), 
MAKE_UNICODE_STRING("great"));
  -
  -    DOMText    *catDataVal = doc->createTextNode(MAKE_UNICODE_STRING("XML 
Security Tools"));
  -    catElem->appendChild(catDataVal);
  -
  -     XSECProvider prov;
  -     DSIGSignature *sig;
  -     DSIGReference *ref[10];
  -     DOMElement *sigNode;
  -     int refCount;
  +     {
   
  -     try {
  -             
                /*
  -              * Now we have a document, create a signature for it.
  +              * First we create a document from scratch
                 */
  +
  +             cerr << "Creating a known doc and signing (HMAC-SHA1)" << endl;
                
  -             sig = prov.newSignature();
  -             sig->setDSIGNSPrefix(MAKE_UNICODE_STRING("ds"));
  +             // Create a blank Document
   
  -             sigNode = sig->createBlankSignature(doc, CANON_C14N_COM, 
SIGNATURE_HMAC, HASH_SHA1);
  -             
rootElem->appendChild(doc->createTextNode(DSIGConstants::s_unicodeStrNL));
  -             rootElem->insertBefore(doc->createComment(MAKE_UNICODE_STRING(" 
a comment ")), prodElem);
  -             rootElem->appendChild(sigNode);
  -             
rootElem->insertBefore(doc->createTextNode(DSIGConstants::s_unicodeStrNL), 
prodElem);
  +             //DOMImplementation impl;
   
  -             /*
  -              * Add some test references
  -              */
  +             XMLCh tempStr[100];
  +             XMLString::transcode("Core", tempStr, 99);    
  +             DOMImplementation *impl = 
DOMImplementationRegistry::getDOMImplementation(tempStr);
  +        
   
  -             ref[0] = sig->createReference(MAKE_UNICODE_STRING(""));
  -             ref[0]->appendEnvelopedSignatureTransform();
  +             DOMDocument *doc = impl->createDocument(
  +                                     0,                    // root element 
namespace URI.
  +                                     MAKE_UNICODE_STRING("ADoc"),            
// root element name
  +                                     NULL);// DOMDocumentType());  // 
document type object (DTD).
  +
  +             DOMElement *rootElem = doc->getDocumentElement();
  +             rootElem->setAttributeNS(DSIGConstants::s_unicodeStrURIXMLNS, 
  +                     MAKE_UNICODE_STRING("xmlns:foo"), 
MAKE_UNICODE_STRING("http://www.foo.org";));
  +
  +             DOMElement  * prodElem = 
doc->createElement(MAKE_UNICODE_STRING("product"));
  +             rootElem->appendChild(prodElem);
  +
  +             DOMText    * prodDataVal = 
doc->createTextNode(MAKE_UNICODE_STRING("XMLSecurityC"));
  +             prodElem->appendChild(prodDataVal);
  +
  +             DOMElement  *catElem = 
doc->createElement(MAKE_UNICODE_STRING("category"));
  +             rootElem->appendChild(catElem);
  +             catElem->setAttribute(MAKE_UNICODE_STRING("idea"), 
MAKE_UNICODE_STRING("great"));
  +
  +             DOMText    *catDataVal = 
doc->createTextNode(MAKE_UNICODE_STRING("XML Security Tools"));
  +             catElem->appendChild(catDataVal);
  +
  +             XSECProvider prov;
  +             DSIGSignature *sig;
  +             DSIGReference *ref[10];
  +             DOMElement *sigNode;
  +             int refCount;
   
  -             ref[1] = 
sig->createReference(MAKE_UNICODE_STRING("#xpointer(/)"));
  -             ref[1]->appendEnvelopedSignatureTransform();
  -             ref[1]->appendCanonicalizationTransform(CANON_C14N_NOC);
  -
  -             ref[2] = 
sig->createReference(MAKE_UNICODE_STRING("#xpointer(/)"));
  -             ref[2]->appendEnvelopedSignatureTransform();
  -             ref[2]->appendCanonicalizationTransform(CANON_C14N_COM);
  -
  -             ref[3] = 
sig->createReference(MAKE_UNICODE_STRING("#xpointer(/)"));
  -             ref[3]->appendEnvelopedSignatureTransform();
  -             ref[3]->appendCanonicalizationTransform(CANON_C14NE_NOC);
  -
  -             ref[4] = 
sig->createReference(MAKE_UNICODE_STRING("#xpointer(/)"));
  -             ref[4]->appendEnvelopedSignatureTransform();
  -             ref[4]->appendCanonicalizationTransform(CANON_C14NE_COM);
  -
  -             ref[5] = 
sig->createReference(MAKE_UNICODE_STRING("#xpointer(/)"));
  -             ref[5]->appendEnvelopedSignatureTransform();
  -             DSIGTransformC14n * ce = 
ref[5]->appendCanonicalizationTransform(CANON_C14NE_COM);
  -             ce->addInclusiveNamespace("foo");
  -
  -             sig->setECNSPrefix(MAKE_UNICODE_STRING("ec"));
  -             ref[6] = 
sig->createReference(MAKE_UNICODE_STRING("#xpointer(/)"));
  -             ref[6]->appendEnvelopedSignatureTransform();
  -             ce = ref[6]->appendCanonicalizationTransform(CANON_C14NE_COM);
  -             ce->addInclusiveNamespace("foo");
  +             try {
  +                     
  +                     /*
  +                      * Now we have a document, create a signature for it.
  +                      */
  +                     
  +                     sig = prov.newSignature();
  +                     sig->setDSIGNSPrefix(MAKE_UNICODE_STRING("ds"));
   
  -#ifdef XSEC_NO_XALAN
  +                     sigNode = sig->createBlankSignature(doc, 
CANON_C14N_COM, SIGNATURE_HMAC, HASH_SHA1);
  +                     
rootElem->appendChild(doc->createTextNode(DSIGConstants::s_unicodeStrNL));
  +                     
rootElem->insertBefore(doc->createComment(MAKE_UNICODE_STRING(" a comment ")), 
prodElem);
  +                     rootElem->appendChild(sigNode);
  +                     
rootElem->insertBefore(doc->createTextNode(DSIGConstants::s_unicodeStrNL), 
prodElem);
   
  -             cerr << "WARNING : No testing of XPath being performed as Xalan 
not present" << endl;
  -             refCount = 7;
  +                     /*
  +                      * Add some test references
  +                      */
   
  -#else
  -             /*
  -              * Create some XPath/XPathFilter references
  -              */
  +                     ref[0] = sig->createReference(MAKE_UNICODE_STRING(""));
  +                     ref[0]->appendEnvelopedSignatureTransform();
   
  +                     ref[1] = 
sig->createReference(MAKE_UNICODE_STRING("#xpointer(/)"));
  +                     ref[1]->appendEnvelopedSignatureTransform();
  +                     ref[1]->appendCanonicalizationTransform(CANON_C14N_NOC);
   
  -             ref[7] = sig->createReference(MAKE_UNICODE_STRING(""));
  -             sig->setXPFNSPrefix(MAKE_UNICODE_STRING("xpf"));
  -             DSIGTransformXPathFilter * xpf = 
ref[7]->appendXPathFilterTransform();
  -             xpf->appendFilter(FILTER_INTERSECT, 
MAKE_UNICODE_STRING("//ADoc/category"));
  -
  -             ref[8] = sig->createReference(MAKE_UNICODE_STRING(""));
  -             /*              
ref[5]->appendXPathTransform("ancestor-or-self::dsig:Signature", 
  -                             
"xmlns:dsig=http://www.w3.org/2000/09/xmldsig#";); */
  -
  -             DSIGTransformXPath * x = 
ref[8]->appendXPathTransform("count(ancestor-or-self::dsig:Signature | \
  -here()/ancestor::dsig:Signature[1]) > \
  -count(ancestor-or-self::dsig:Signature)");
  -             x->setNamespace("dsig", "http://www.w3.org/2000/09/xmldsig#";);
  +                     ref[2] = 
sig->createReference(MAKE_UNICODE_STRING("#xpointer(/)"));
  +                     ref[2]->appendEnvelopedSignatureTransform();
  +                     ref[2]->appendCanonicalizationTransform(CANON_C14N_COM);
   
  -             refCount = 9;
  +                     ref[3] = 
sig->createReference(MAKE_UNICODE_STRING("#xpointer(/)"));
  +                     ref[3]->appendEnvelopedSignatureTransform();
  +                     
ref[3]->appendCanonicalizationTransform(CANON_C14NE_NOC);
   
  -#endif
  -     
  -             /*
  -              * Sign the document, using an HMAC algorithm and the key 
"secret"
  -              */
  +                     ref[4] = 
sig->createReference(MAKE_UNICODE_STRING("#xpointer(/)"));
  +                     ref[4]->appendEnvelopedSignatureTransform();
  +                     
ref[4]->appendCanonicalizationTransform(CANON_C14NE_COM);
   
  +                     ref[5] = 
sig->createReference(MAKE_UNICODE_STRING("#xpointer(/)"));
  +                     ref[5]->appendEnvelopedSignatureTransform();
  +                     DSIGTransformC14n * ce = 
ref[5]->appendCanonicalizationTransform(CANON_C14NE_COM);
  +                     ce->addInclusiveNamespace("foo");
   
  -             sig->appendKeyName(MAKE_UNICODE_STRING("The secret key is 
\"secret\""));
  +                     sig->setECNSPrefix(MAKE_UNICODE_STRING("ec"));
  +                     ref[6] = 
sig->createReference(MAKE_UNICODE_STRING("#xpointer(/)"));
  +                     ref[6]->appendEnvelopedSignatureTransform();
  +                     ce = 
ref[6]->appendCanonicalizationTransform(CANON_C14NE_COM);
  +                     ce->addInclusiveNamespace("foo");
   
  -             // Append a test DNames
  +     #ifdef XSEC_NO_XALAN
   
  -             DSIGKeyInfoX509 * x509 = sig->appendX509Data();
  -             x509->setX509SubjectName(s_tstDName);
  +                     cerr << "WARNING : No testing of XPath being performed 
as Xalan not present" << endl;
  +                     refCount = 7;
   
  -             // Append a test PGPData element
  -             sig->appendPGPData(s_tstPGPKeyID, s_tstPGPKeyPacket);
  +     #else
  +                     /*
  +                      * Create some XPath/XPathFilter references
  +                      */
   
  -             // Append an SPKIData element
  -             DSIGKeyInfoSPKIData * spki = sig->appendSPKIData(s_tstSexp1);
  -             spki->appendSexp(s_tstSexp2);
   
  -             // Append a MgmtData element
  -             sig->appendMgmtData(s_tstMgmtData);
  +                     ref[7] = sig->createReference(MAKE_UNICODE_STRING(""));
  +                     sig->setXPFNSPrefix(MAKE_UNICODE_STRING("xpf"));
  +                     DSIGTransformXPathFilter * xpf = 
ref[7]->appendXPathFilterTransform();
  +                     xpf->appendFilter(FILTER_INTERSECT, 
MAKE_UNICODE_STRING("//ADoc/category"));
   
  -             sig->setSigningKey(createHMACKey((unsigned char *) "secret"));
  -             sig->sign();
  +                     ref[8] = sig->createReference(MAKE_UNICODE_STRING(""));
  +                     /*              
ref[5]->appendXPathTransform("ancestor-or-self::dsig:Signature", 
  +                                     
"xmlns:dsig=http://www.w3.org/2000/09/xmldsig#";); */
   
  -             cerr << "Doc signed OK - Checking values against Known Good" << 
endl;
  +                     DSIGTransformXPath * x = 
ref[8]->appendXPathTransform("count(ancestor-or-self::dsig:Signature | \
  +     here()/ancestor::dsig:Signature[1]) > \
  +     count(ancestor-or-self::dsig:Signature)");
  +                     x->setNamespace("dsig", 
"http://www.w3.org/2000/09/xmldsig#";);
   
  -             unsigned char buf[128];
  -             int len;
  +                     refCount = 9;
   
  -             /*
  -              * Validate the reference hash values from known good
  -              */
  +     #endif
  +             
  +                     /*
  +                      * Sign the document, using an HMAC algorithm and the 
key "secret"
  +                      */
   
  -             int i;
  -             for (i = 0; i < refCount; ++i) {
   
  -                     cerr << "Calculating hash for reference " << i << " ... 
";
  +                     sig->appendKeyName(MAKE_UNICODE_STRING("The secret key 
is \"secret\""));
   
  -                     len = (int) ref[i]->calculateHash(buf, 128);
  +                     // Append a test DNames
   
  -                     cerr << " Done\nChecking -> ";
  +                     DSIGKeyInfoX509 * x509 = sig->appendX509Data();
  +                     x509->setX509SubjectName(s_tstDName);
   
  -                     if (len != 20) {
  -                             cerr << "Bad (Length = " << len << ")" << endl;
  -                             exit (1);
  -                     }
  +                     // Append a test PGPData element
  +                     sig->appendPGPData(s_tstPGPKeyID, s_tstPGPKeyPacket);
   
  -                     for (int j = 0; j < 20; ++j) {
  +                     // Append an SPKIData element
  +                     DSIGKeyInfoSPKIData * spki = 
sig->appendSPKIData(s_tstSexp1);
  +                     spki->appendSexp(s_tstSexp2);
   
  -                             if (buf[j] != createdDocRefs[i][j]) {
  -                                     cerr << "Bad at location " << j << endl;
  -                                     exit (1);
  -                             }
  -                     
  -                     }
  -                     cerr << "Good.\n";
  +                     // Append a MgmtData element
  +                     sig->appendMgmtData(s_tstMgmtData);
   
  -             }
  +                     sig->setSigningKey(createHMACKey((unsigned char *) 
"secret"));
  +                     sig->sign();
   
  -             /*
  -              * Verify the signature check works
  -              */
  +                     cerr << "Doc signed OK - Checking values against Known 
Good" << endl;
   
  -             cerr << "Running \"verifySignatureOnly()\" on calculated 
signature ... ";
  -             if (sig->verifySignatureOnly()) {
  -                     cerr << "OK" << endl;
  -             }
  -             else {
  -                     cerr << "Failed" << endl;
  -                     char * e = XMLString::transcode(sig->getErrMsgs());
  -                     cout << e << endl;
  -                     delete [] e;
  -                     exit(1);
  -             }
  +                     unsigned char buf[128];
  +                     int len;
   
  -             /*
  -              * Change the document and ensure the signature fails.
  -              */
  +                     /*
  +                      * Validate the reference hash values from known good
  +                      */
   
  -             cerr << "Setting incorrect key in Signature object" << endl;
  -             sig->setSigningKey(createHMACKey((unsigned char *) 
"badsecret"));
  +                     int i;
  +                     for (i = 0; i < refCount; ++i) {
   
  -             cerr << "Running \"verifySignatureOnly()\" on calculated 
signature ... ";
  -             if (!sig->verifySignatureOnly()) {
  -                     cerr << "OK (Signature bad)" << endl;
  -             }
  -             else {
  -                     cerr << "Failed (signature OK but should be bad)" << 
endl;
  -                     exit(1);
  -             }
  +                             cerr << "Calculating hash for reference " << i 
<< " ... ";
   
  -             // Don't need the signature now the DOM structure is in place
  -             prov.releaseSignature(sig);
  +                             len = (int) ref[i]->calculateHash(buf, 128);
   
  -             /*
  -              * Now serialise the document to memory so we can re-parse and 
check from scratch
  -              */
  +                             cerr << " Done\nChecking -> ";
   
  -             cerr << "Serialising the document to a memory buffer ... ";
  +                             if (len != 20) {
  +                                     cerr << "Bad (Length = " << len << ")" 
<< endl;
  +                                     exit (1);
  +                             }
   
  -             DOMWriter         *theSerializer = 
((DOMImplementationLS*)impl)->createDOMWriter();
  +                             for (int j = 0; j < 20; ++j) {
   
  -             theSerializer->setEncoding(MAKE_UNICODE_STRING("UTF-8"));
  -             if 
(theSerializer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, false))
  -                     
theSerializer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, false);
  +                                     if (buf[j] != createdDocRefs[i][j]) {
  +                                             cerr << "Bad at location " << j 
<< endl;
  +                                             exit (1);
  +                                     }
  +                             
  +                             }
  +                             cerr << "Good.\n";
   
  +                     }
   
  -             MemBufFormatTarget *formatTarget = new MemBufFormatTarget();
  +                     /*
  +                      * Verify the signature check works
  +                      */
  +
  +                     cerr << "Running \"verifySignatureOnly()\" on 
calculated signature ... ";
  +                     if (sig->verifySignatureOnly()) {
  +                             cerr << "OK" << endl;
  +                     }
  +                     else {
  +                             cerr << "Failed" << endl;
  +                             char * e = 
XMLString::transcode(sig->getErrMsgs());
  +                             cout << e << endl;
  +                             delete [] e;
  +                             exit(1);
  +                     }
   
  -             theSerializer->writeNode(formatTarget, *doc);
  +                     /*
  +                      * Change the document and ensure the signature fails.
  +                      */
  +
  +                     cerr << "Setting incorrect key in Signature object" << 
endl;
  +                     sig->setSigningKey(createHMACKey((unsigned char *) 
"badsecret"));
  +
  +                     cerr << "Running \"verifySignatureOnly()\" on 
calculated signature ... ";
  +                     if (!sig->verifySignatureOnly()) {
  +                             cerr << "OK (Signature bad)" << endl;
  +                     }
  +                     else {
  +                             cerr << "Failed (signature OK but should be 
bad)" << endl;
  +                             exit(1);
  +                     }
   
  -             // Copy to a new buffer
  -             len = formatTarget->getLen();
  -             char * mbuf = new char [len + 1];
  -             memcpy(mbuf, formatTarget->getRawBuffer(), len);
  -             mbuf[len] = '\0';
  +                     // Don't need the signature now the DOM structure is in 
place
  +                     prov.releaseSignature(sig);
   
  -             delete theSerializer;
  -             delete formatTarget;
  +                     /*
  +                      * Now serialise the document to memory so we can 
re-parse and check from scratch
  +                      */
   
  -             cerr << "done\nParsing memory buffer back to DOM ... ";
  +                     cerr << "Serialising the document to a memory buffer 
... ";
   
  -             // Also release the document so that we can re-load from scratch
  +                     DOMWriter         *theSerializer = 
((DOMImplementationLS*)impl)->createDOMWriter();
   
  -             doc->release();
  +                     
theSerializer->setEncoding(MAKE_UNICODE_STRING("UTF-8"));
  +                     if 
(theSerializer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, false))
  +                             
theSerializer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, false);
   
  -             /*
  -              * Re-parse
  -              */
   
  -             XercesDOMParser parser;
  -             
  -             parser.setDoNamespaces(true);
  -             parser.setCreateEntityReferenceNodes(true);
  +                     MemBufFormatTarget *formatTarget = new 
MemBufFormatTarget();
   
  -             MemBufInputSource* memIS = new MemBufInputSource ((const 
XMLByte*) mbuf, 
  -                                                                             
                                                len, "XSECMem");
  +                     theSerializer->writeNode(formatTarget, *doc);
   
  -             parser.parse(*memIS);
  -             doc = parser.adoptDocument();
  +                     // Copy to a new buffer
  +                     len = formatTarget->getLen();
  +                     char * mbuf = new char [len + 1];
  +                     memcpy(mbuf, formatTarget->getRawBuffer(), len);
  +                     mbuf[len] = '\0';
   
  +                     delete theSerializer;
  +                     delete formatTarget;
   
  -             delete(memIS);
  -             delete[] mbuf;
  +                     cerr << "done\nParsing memory buffer back to DOM ... ";
   
  -             cerr << "done\nValidating signature ...";
  +                     // Also release the document so that we can re-load 
from scratch
   
  -             /*
  -              * Validate signature
  -              */
  +                     doc->release();
   
  -             sig = prov.newSignatureFromDOM(doc);
  -             sig->load();
  -             sig->setSigningKey(createHMACKey((unsigned char *) "secret"));
  +                     /*
  +                      * Re-parse
  +                      */
   
  -             if (sig->verify()) {
  -                     cerr << "OK" << endl;
  -             }
  -             else {
  -                     cerr << "Failed\n" << endl;
  -                     char * e = XMLString::transcode(sig->getErrMsgs());
  -                     cerr << e << endl;
  -                     delete [] e;
  -                     exit(1);
  -             }
  +                     XercesDOMParser parser;
  +                     
  +                     parser.setDoNamespaces(true);
  +                     parser.setCreateEntityReferenceNodes(true);
   
  -             /*
  -              * Ensure DNames are read back in and decoded properly
  -              */
  +                     MemBufInputSource* memIS = new MemBufInputSource 
((const XMLByte*) mbuf, 
  +                                                                             
                                                        len, "XSECMem");
   
  -             DSIGKeyInfoList * kil = sig->getKeyInfoList();
  -             int nki = kil->getSize();
  +                     parser.parse(*memIS);
  +                     doc = parser.adoptDocument();
   
  -             cerr << "Checking Distinguished name is decoded correctly ... ";
  -             for (i = 0; i < nki; ++i) {
   
  -                     if (kil->item(i)->getKeyInfoType() == 
DSIGKeyInfo::KEYINFO_X509) {
  +                     delete(memIS);
  +                     delete[] mbuf;
   
  -                             if (strEquals(s_tstDName, ((DSIGKeyInfoX509 *) 
kil->item(i))->getX509SubjectName())) {
  -                                     cerr << "yes" << endl;
  -                             }
  -                             else {
  -                                     cerr << "decoded incorrectly" << endl;;
  -                                     exit (1);
  -                             }
  -                     }
  -                     if (kil->item(i)->getKeyInfoType() == 
DSIGKeyInfo::KEYINFO_PGPDATA) {
  -                             
  -                             cerr << "Validating PGPData read back OK ... ";
  +                     cerr << "done\nValidating signature ...";
  +
  +                     /*
  +                      * Validate signature
  +                      */
   
  -                             DSIGKeyInfoPGPData * p = (DSIGKeyInfoPGPData 
*)kil->item(i);
  +                     sig = prov.newSignatureFromDOM(doc);
  +                     sig->load();
  +                     sig->setSigningKey(createHMACKey((unsigned char *) 
"secret"));
   
  -                             if (!(strEquals(p->getKeyID(), s_tstPGPKeyID) &&
  -                                     strEquals(p->getKeyPacket(), 
s_tstPGPKeyPacket))) {
  +                     if (sig->verify()) {
  +                             cerr << "OK" << endl;
  +                     }
  +                     else {
  +                             cerr << "Failed\n" << endl;
  +                             char * e = 
XMLString::transcode(sig->getErrMsgs());
  +                             cerr << e << endl;
  +                             delete [] e;
  +                             exit(1);
  +                     }
   
  -                                     cerr << "no!";
  -                                     exit(1);
  +                     /*
  +                      * Ensure DNames are read back in and decoded properly
  +                      */
  +
  +                     DSIGKeyInfoList * kil = sig->getKeyInfoList();
  +                     int nki = kil->getSize();
  +
  +                     cerr << "Checking Distinguished name is decoded 
correctly ... ";
  +                     for (i = 0; i < nki; ++i) {
  +
  +                             if (kil->item(i)->getKeyInfoType() == 
DSIGKeyInfo::KEYINFO_X509) {
  +
  +                                     if (strEquals(s_tstDName, 
((DSIGKeyInfoX509 *) kil->item(i))->getX509SubjectName())) {
  +                                             cerr << "yes" << endl;
  +                                     }
  +                                     else {
  +                                             cerr << "decoded incorrectly" 
<< endl;;
  +                                             exit (1);
  +                                     }
                                }
  +                             if (kil->item(i)->getKeyInfoType() == 
DSIGKeyInfo::KEYINFO_PGPDATA) {
  +                                     
  +                                     cerr << "Validating PGPData read back 
OK ... ";
   
  -                             cerr << "yes\n";
  -                     }
  -                     if (kil->item(i)->getKeyInfoType() == 
DSIGKeyInfo::KEYINFO_SPKIDATA) {
  -                             
  -                             cerr << "Validating SPKIData read back OK ... ";
  +                                     DSIGKeyInfoPGPData * p = 
(DSIGKeyInfoPGPData *)kil->item(i);
   
  -                             DSIGKeyInfoSPKIData * s = (DSIGKeyInfoSPKIData 
*)kil->item(i);
  +                                     if (!(strEquals(p->getKeyID(), 
s_tstPGPKeyID) &&
  +                                             strEquals(p->getKeyPacket(), 
s_tstPGPKeyPacket))) {
   
  -                             if (s->getSexpSize() != 2) {
  -                                     cerr << "no - expected two 
S-expressions";
  -                                     exit(1);
  +                                             cerr << "no!";
  +                                             exit(1);
  +                                     }
  +
  +                                     cerr << "yes\n";
                                }
  +                             if (kil->item(i)->getKeyInfoType() == 
DSIGKeyInfo::KEYINFO_SPKIDATA) {
  +                                     
  +                                     cerr << "Validating SPKIData read back 
OK ... ";
  +
  +                                     DSIGKeyInfoSPKIData * s = 
(DSIGKeyInfoSPKIData *)kil->item(i);
  +
  +                                     if (s->getSexpSize() != 2) {
  +                                             cerr << "no - expected two 
S-expressions";
  +                                             exit(1);
  +                                     }
  +
  +                                     if (!(strEquals(s->getSexp(0), 
s_tstSexp1) &&
  +                                             strEquals(s->getSexp(1), 
s_tstSexp2))) {
   
  -                             if (!(strEquals(s->getSexp(0), s_tstSexp1) &&
  -                                     strEquals(s->getSexp(1), s_tstSexp2))) {
  +                                             cerr << "no!";
  +                                             exit(1);
  +                                     }
   
  -                                     cerr << "no!";
  -                                     exit(1);
  +                                     cerr << "yes\n";
                                }
  +                             if (kil->item(i)->getKeyInfoType() == 
DSIGKeyInfo::KEYINFO_MGMTDATA) {
  +                                     
  +                                     cerr << "Validating MgmtData read back 
OK ... ";
   
  -                             cerr << "yes\n";
  -                     }
  -                     if (kil->item(i)->getKeyInfoType() == 
DSIGKeyInfo::KEYINFO_MGMTDATA) {
  -                             
  -                             cerr << "Validating MgmtData read back OK ... ";
  +                                     DSIGKeyInfoMgmtData * m = 
(DSIGKeyInfoMgmtData *)kil->item(i);
   
  -                             DSIGKeyInfoMgmtData * m = (DSIGKeyInfoMgmtData 
*)kil->item(i);
  +                                     if (!strEquals(m->getData(), 
s_tstMgmtData)) {
   
  -                             if (!strEquals(m->getData(), s_tstMgmtData)) {
  +                                             cerr << "no!";
  +                                             exit(1);
  +                                     }
   
  -                                     cerr << "no!";
  -                                     exit(1);
  +                                     cerr << "yes\n";
                                }
  -
  -                             cerr << "yes\n";
                        }
                }
  -     }
   
  -     catch (XSECException &e)
  -     {
  -             cerr << "An error occured during signature processing\n   
Message: ";
  -             char * ce = XMLString::transcode(e.getMsg());
  -             cerr << ce << endl;
  -             delete ce;
  -             exit(1);
  +             catch (XSECException &e)
  +             {
  +                     cerr << "An error occured during signature processing\n 
  Message: ";
  +                     char * ce = XMLString::transcode(e.getMsg());
  +                     cerr << ce << endl;
  +                     delete ce;
  +                     exit(1);
  +                     
  +             }       
  +             catch (XSECCryptoException &e)
  +             {
  +                     cerr << "A cryptographic error occured during signature 
processing\n   Message: "
  +                     << e.getMsg() << endl;
  +                     exit(1);
  +             }
  +
  +             DOMWriter         *theSerializer = 
((DOMImplementationLS*)impl)->createDOMWriter();
  +
  +             theSerializer->setEncoding(MAKE_UNICODE_STRING("UTF-8"));
  +             if 
(theSerializer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, false))
  +                     
theSerializer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, false);
  +
  +
  +             XMLFormatTarget *formatTarget = new StdOutFormatTarget();
  +
  +             theSerializer->writeNode(formatTarget, *doc);
                
  -     }       
  -     catch (XSECCryptoException &e)
  -     {
  -             cerr << "A cryptographic error occured during signature 
processing\n   Message: "
  -             << e.getMsg() << endl;
  -             exit(1);
  +             cout << endl;
  +
  +             delete theSerializer;
  +             delete formatTarget;
  +
  +             doc->release();
  +
  +             cerr << "All tests passed" << endl;
  +
        }
   
  -     DOMWriter         *theSerializer = 
((DOMImplementationLS*)impl)->createDOMWriter();
  +     XSECPlatformUtils::Terminate();
  +#ifndef XSEC_NO_XALAN
  +     XalanTransformer::terminate();
  +     XPathEvaluator::terminate();
  +#endif
  +     XMLPlatformUtils::Terminate();
   
  -     theSerializer->setEncoding(MAKE_UNICODE_STRING("UTF-8"));
  -     if (theSerializer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, 
false))
  -             theSerializer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, 
false);
  +#if defined (_DEBUG) && defined (_MSC_VER)
   
  +     _CrtMemCheckpoint( &s2 );
   
  -     XMLFormatTarget *formatTarget = new StdOutFormatTarget();
  +     if ( _CrtMemDifference( &s3, &s1, &s2 ) && (
  +             s3.lCounts[0] > 0 ||
  +             s3.lCounts[1] > 1 ||
  +             // s3.lCounts[2] > 2 ||  We don't worry about C Runtime
  +             s3.lCounts[3] > 0 ||
  +             s3.lCounts[4] > 0)) {
  +
  +             // Note that there is generally 1 Normal and 1 CRT block
  +             // still taken.  1 is from Xalan and 1 from stdio
  +
  +             // Send all reports to STDOUT
  +             _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
  +             _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
  +             _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
  +             _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
  +             _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
  +             _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );
   
  -     theSerializer->writeNode(formatTarget, *doc);
  -     
  -     cout << endl;
  +             // Dumpy memory stats
   
  -     delete theSerializer;
  -     delete formatTarget;
  +             _CrtMemDumpAllObjectsSince( &s3 );
  +         _CrtMemDumpStatistics( &s3 );
  +     }
   
  -     doc->release();
  +     // Now turn off memory leak checking and end as there are some 
  +     // Globals that are allocated that get seen as leaks (Xalan?)
  +
  +     int dbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
  +     dbgFlag &= ~(_CRTDBG_LEAK_CHECK_DF);
  +     _CrtSetDbgFlag( dbgFlag );
  +
  +#endif
   
  -     cerr << "All tests passed" << endl;
   
        return 0;
   
  
  
  

Reply via email to