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

Reply via email to