Can someone please
help me or point me in the right direction. When
running my application memory usage increases slowly by about 6mb /
hour. Commenting out the function digital signature validation routing
ValidateSig() stops the memory increase.
a) I am getting no errors,
so the leak can is not inside my "catch" constructs.
b) I am using the MS
Crypto api .. (is that relevant??)
c) I am linking to
xerces-c_2_6.dll [release] and xsec_1_2_0.dll [release] with no XALAN
support on Windows 2003 compiled with
VS2003.net
I have looked up &
down this source and can see no obvious mistakes!
Can anyone help me
please?
BOOL
ValidateSig()
{
//
// parse the XML document, load in the signature
field and attempt to validate it using a copy of the
// X509 public
key we create earlier from the certificate store.
//
BOOL
valid = FALSE;
try
{
XercesDOMParser parser;
parser.setDoNamespaces(true);
parser.setCreateEntityReferenceNodes(true);
parser.setDoSchema(true);
MemBufInputSource
*memIS = new MemBufInputSource((const XMLByte *)buffer, bufferLen,
"XSECMem",
false);
parser.parse(*memIS);
delete
memIS;
// destroy as soon as possible
if(parser.getErrorCount() > 0)
{
Display( "Error parsing input document",
"error in XML parse", buffer, bufferLen)
);
return
FALSE;
}
// Now create
a signature object to validate the document
XSECProvider
prov;
DSIGSignature *sig =
prov.newSignatureFromDOM(parser.getDocument());
sig->registerIdAttributeName(config.idAttributeName);
sig->registerIdAttributeNameNS(config.idAttributeNS,
config.idAttributeName);
sig->load();
sig->setSigningKey(X509->clonePublicKey());
if(sig->verify())
{
Display(_T("Signature
Valid...OK"));
valid = TRUE; // the
only way to set this is if this fn() is successfull
}
else
{
char *err =
XMLString::transcode(sig->getErrMsgs());
Display("Error parsing [or] validating
document", err, buffer, bufferLen);
XSEC_RELEASE_XMLCH(err);
Display("Error parsing [or] validating
document\n%s", sig->getErrMsgs());
}
prov->releaseSignature(sig);
}
catch(XSECException &e) //
signature related errors
{
char *err =
XMLString::transcode(e.getMsg());
Display( "An error occured during signature
load", err, buffer, bufferLen);
XSEC_RELEASE_XMLCH(err);
Display(_T("An error occured during signature
load\n%s", e.getMsg()); // e.getMsg() is WIDE
}
catch(const XMLException &e) // xml related parsing errors
{
char *err =
XMLString::transcode(e.getMessage());
Display("An error occured during xerces
parsing and loading of xml", err, buffer, bufferLen);
XSEC_RELEASE_XMLCH(err);
Display( _T("An error occured during xerces parsing and loading of
xml\n%s"), e.getMessage()); // e.getMessage() is WIDE
}
return valid;
}
//
XSec startup code && x509 constuction.. dont think its relevant
here.
SomeConstructor()
{
// startup xerces & xsec
for signature validation
// because parts of the Apache signature
library are not thread safe - all initialisation
// now takes place
inside the constructor - rather than the preferred Init() method.
//
i NEVER destroy the cryptoProv object... it is owned by XSEC and is killed vie
XSECPlatformUtils::Terminate()
//
try
{
// initialize xerces xml parser and the Apache
XML-Security library
XMLPlatformUtils::Initialize();
XSECPlatformUtils::Initialise();
cryptoProv = new
WinCAPICryptoProvider(NULL, NULL, 0);
XSECPlatformUtils::SetCryptoProvider(cryptoProv);
// this is set "globally"
}
catch(const XMLException
&e)
{
throw; // rethrow..to waiting
handler
}
}
BOOL
CreateX509()
{
//
// load the public key from the
certificate store.
// install the key as a service
certificate using mmc->certificates->services certificate,
//
browse for the "microsoft firewall" and install the cert in the Trusted Root
Authority.
// For example the "microsoft firewall" uses the
storeName L"fwsrv\Root"
//
HCERTSTORE certStore = NULL;
PCCERT_CONTEXT
certContext = NULL;
DWORD certOpenFlags =
CERT_STORE_OPEN_EXISTING_FLAG | CERT_SYSTEM_STORE_SERVICES |
CERT_STORE_READONLY_FLAG;
// open the store .. fail if the store does
not exist, look in the services store, open for readonly
certStore =
CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, certOpenFlags,
config.storeName);
if(certStore == NULL)
{
_com_error e(GetLastError());
return FALSE;
}
// find signer's certificate
certContext = CertFindCertificateInStore(certStore, (PKCS_7_ASN_ENCODING |
X509_ASN_ENCODING), 0, CERT_FIND_SUBJECT_STR, config.signerName ,
NULL);
CertCloseStore(certStore, 0); // close the store
regardless
if(certContext == NULL)
{
_com_error e(GetLastError());
return FALSE;
}
try
{
if(X509 != NULL) // if we have already been
created .. then destroy and re-create
delete
X509; // X509 destructor takes care of
CertFreeCertificateContext()
X509 = new
WinCAPICryptoX509(certContext, cryptoProv->getProviderRSA(),
cryptoProv->getProviderDSS());
}
catch(XSECCryptoException &e)
{
delete
X509;
return FALSE;
}
return TRUE;
}