Thanks for the insight Jesse. Do you know of any references or examples I can use as a start point.
I apologise if I should be asking these questions in the Apache Xml mailing list. I thought it was relevant to this list because of the last param of "XSecMem" in MemBufInputSource(). Thanks again -----Original Message----- From: Jesse Pelton [mailto:[EMAIL PROTECTED] Sent: 19 August 2005 14:47 To: security-dev@xml.apache.org Subject: RE: How do I avoid creating buffers just to pass data to MemBufInputSource() You can prevent MemBufInputSource from cloning the buffer with MemBufInputSource::setCopyBufToStream(false). I think you can avoid the need for any buffers by implementing your own InputSource and BinInputStream. It looks to me like you only need to implement InputSource::makeStream(), BinInputStream::curPos(), and BinInputStream::readBytes(). > -----Original Message----- > From: Cullum, Steve [mailto:[EMAIL PROTECTED] > Sent: Friday, August 19, 2005 8:36 AM > To: security-dev@xml.apache.org > Subject: How do I avoid creating buffers just to pass data to > MemBufInputSource() > > I am using Apache sec lib inside an ISAPI filter to validate digital > sigs as they flow through our network. > > I store the raw packets as they are streamed over the network inside a > linked list and want to avoid excessive buffer copying. > Currently I walk > my list of packets, accumulate the packets into a buffer and pass this > buffer into MemBufInputSource(); which internally creates another copy > (I now have 2 temporary copies of the orignal stream). Is there > anyway I can override this behaviour to pass my custom packet linked > list into > MemBufInputSource() thus avoiding the buffer creation/copy? > > // super simple List of nodes > struct Node > { > void *data; > int len; > struct Node *next; > }; > Node *LList; > > Ideally I want to do...something akin to the following.. can this be > done? > > MemMyLinkedListInputSource *memIS = new MemMyLinkedListInputSource > ((const XMLByte *)llist, "XSECMem"); > parser.parse(*memIS); > Or > parser.parse(LList); // this is gonna be a no-no > > To explain my current situation, rough pseudo code is probably easier > to understand. > > > > > ValidateSoapXML(struct Node *rawPacketBuffer /* filled linked list of > SOAP packets */) { > > Char *buffer = BuildBufferFromAllThePacketsInList(rawPacketBuffer); > Int bufferLen = > GetBufferLenFromAllThePacketsInList(rawPacketBuffer); > > // > // 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. > // > HRESULT hr = S_FALSE; > > XercesDOMParser *parser; > > try > { > XercesDOMParser parser; // NOT new'ed .. Don't > think this is an issue > parser.setDoNamespaces(true); > parser.setCreateEntityReferenceNodes(true); > parser.setDoSchema(true); > > MemBufInputSource *memIS = new MemBufInputSource((const XMLByte > *)buffer, bufferLen, "XSECMem"); > > parser.parse(*memIS); > delete memIS; // destroy as soon as possible > > if(parser.getErrorCount() > 0) > { > OutputDebugStringF(_T("Error parsing input document\n")); > return hr; > } > > // 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()) > { > OutputDebugStringW(_T("Signature Valid")); > hr = S_OK; // the only way to set this is if this fn() is > successfull > } > else > { > // sig->getErrMsgs() is WIDE > OutputDebugStringF(_T("Error parsing & validating document > %s\n"), > sig->getErrMsgs()); > } > } > catch(XSECException &e) // signature related errors) > { > // e.getMsg() is WIDE > OutputDebugStringW(_T("EURESWEBFILTER:An error occured during a > signature load %s\n"), e.getMsg()); > } > catch(const XMLException &e) // xml related parsing errors) > { > // e.getMessage() is WIDE > OutputDebugStringW(_T("An error occured during a xerces parsing > and loading of xml %s\n"), > } > return hr; > } > > > > > Thanks > > Steve > >