Mixe for Privacy and Anonymity in the Internet
CAUtil.cpp
Go to the documentation of this file.
00001 /*
00002 Copyright (c) 2000, The JAP-Team
00003 All rights reserved.
00004 Redistribution and use in source and binary forms, with or without modification,
00005 are permitted provided that the following conditions are met:
00006 
00007   - Redistributions of source code must retain the above copyright notice,
00008     this list of conditions and the following disclaimer.
00009 
00010   - Redistributions in binary form must reproduce the above copyright notice,
00011     this list of conditions and the following disclaimer in the documentation and/or
00012     other materials provided with the distribution.
00013 
00014   - Neither the name of the University of Technology Dresden, Germany nor the names of its contributors
00015     may be used to endorse or promote products derived from this software without specific
00016     prior written permission.
00017 
00018 
00019 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS
00020 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
00021 AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
00022 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00023 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
00024 OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
00025 IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
00027 */
00028 #include "StdAfx.h"
00029 #include "CAUtil.hpp"
00030 #include "CABase64.hpp"
00031 #ifdef DEBUG
00032   #include "CAMsg.hpp"
00033 #endif
00034 #include "xml/DOM_Output.hpp"
00035 #include "CASymCipher.hpp"
00036 
00037 #ifdef HAVE_SBRK
00038   char* internal_sbrk_start=(char*)sbrk(0);
00039 #endif
00040 
00041 #ifdef LOG_CRIME
00042   #include "tre/regex.h"
00043 #endif
00044 
00051 UINT32 strtrim(UINT8* s)
00052   {
00053     if(s==NULL)
00054       return 0;
00055     UINT32 end=strlen((char*)s);
00056     if(end==0)
00057       return 0;
00058     end--;
00059     UINT32 start=0;
00060     UINT32 size;
00061     while(start<=end&&s[start]<=32)
00062       start++;
00063     if(start>end) //empty string....
00064       return 0;
00065     while(end>start&&s[end]<=32)
00066       end--;
00067     size=(end+1)-start;
00068     memmove(s,s+start,size);
00069     s[size]=0;
00070     return size;
00071   }
00072   
00073 UINT32 toLower(UINT8* a_string)
00074 {
00075   int differ = 'A'-'a';
00076   char ch;
00077   int ii = strlen((char*)a_string);
00078   for (int i=0; i <ii;i++)
00079   {
00080     strncpy(&ch,(char*)a_string+i,1);
00081     if (ch>='A' && ch<='Z')
00082     {
00083       ch = ch-differ;
00084       memcpy(a_string+i,&ch,1);
00085     }
00086   }
00087   return E_SUCCESS;
00088 }
00089 
00090 UINT8* bytes2hex(const void* bytes,UINT32 len)
00091   {
00092     if(bytes==NULL||len==0)
00093       return NULL;
00094     UINT8* buff=new UINT8[len*3+1];
00095     UINT32 aktInd=0;
00096     for(UINT32 i=0;i<len;i++)
00097       {
00098         UINT8 b1=((UINT8*)bytes)[i];
00099         UINT8 b=(b1>>4);
00100         if(b>9)
00101           b+=55;
00102         else
00103           b+=48;
00104         buff[aktInd++]=b;
00105         b=(b1&0x0F);
00106         if(b>9)
00107           b+=55;
00108         else
00109           b+=48;
00110         buff[aktInd++]=b;
00111         buff[aktInd++]=32;
00112       }
00113     buff[len*3]=0;
00114     return buff;
00115   }
00116 
00126 SINT32 memtrim(UINT8* dest,const UINT8* src,UINT32 size)
00127   {
00128     if(src==NULL||size==0)
00129       return 0;
00130     if(dest==NULL)
00131       return E_UNSPECIFIED;
00132     UINT32 start=0;
00133     UINT32 end=size-1;
00134     while(start<=end&&src[start]<=32)
00135       start++;
00136     if(start>end) //empty string....
00137       return 0;
00138     while(end>start&&src[end]<=32)
00139       end--;
00140     size=(end+1)-start;
00141     memmove(dest,src+start,size);
00142     return (SINT32)size;
00143   }
00144 
00148 char* strins(const char* src,UINT32 pos,const char* ins)
00149   {
00150     if(src==NULL||ins==NULL)
00151       return NULL;
00152     UINT32 srcLen=strlen(src);
00153     if(pos>srcLen)
00154       return NULL;
00155     UINT32 insLen=strlen(ins);
00156     char* newString=new char[srcLen+insLen+1];
00157     if(newString==NULL)
00158       return NULL;
00159     memcpy(newString,src,pos);
00160     memcpy(newString+pos,ins,insLen);
00161     memcpy(newString+pos+insLen,src+pos,srcLen-pos+1); //copy includes the \0
00162     return newString;
00163   }
00164 
00168 char* strins(const char* src,const char * pos,const char* ins)
00169   {
00170     if(pos==NULL||pos<src)
00171       return NULL;
00172     return strins(src,pos-src,ins);
00173   }
00174 
00176 void logMemoryUsage()
00177   {
00178 #ifdef HAVE_SBRK
00179     CAMsg::printMsg(LOG_DEBUG,"Memory consumption reported by sbrk(): %u\n",(long)((char*)sbrk(0)-internal_sbrk_start));
00180 #endif
00181 #ifdef HAVE_MALLINFO
00182     struct mallinfo malli=mallinfo();
00183     //memset(&malli,0,sizeo(malli));
00184     CAMsg::printMsg(LOG_DEBUG,"Memory consumption reported by mallinfo():\n");
00185     CAMsg::printMsg(LOG_DEBUG,"\t Total size of memory allocated with sbrk() by malloc() [bytes]: %i\n",malli.arena);
00186     CAMsg::printMsg(LOG_DEBUG,"\t Number of chunks not in use: %i\n",malli.ordblks);
00187     CAMsg::printMsg(LOG_DEBUG,"\t Total number of chunks allocated with mmap(): %i\n",malli.hblks);
00188     CAMsg::printMsg(LOG_DEBUG,"\t Total size of memory allocated with mmap() [byte]: %i\n",malli.hblkhd);
00189     CAMsg::printMsg(LOG_DEBUG,"\t Total size of memory occupied by chunks handed out by malloc(): %i\n",malli.uordblks);
00190     CAMsg::printMsg(LOG_DEBUG,"\t Total size of memory occupied by free (not in use) chunks: %i\n",malli.fordblks);
00191     CAMsg::printMsg(LOG_DEBUG,"\t Size of the top-most releasable chunk that normally borders the end of the heap: %i\n",malli.keepcost);
00192 #endif
00193   }
00194 
00201 /*SINT32 getcurrentTimeMillis(BIGNUM* bnTime)
00202   {
00203     if(bnTime==NULL)
00204       return E_UNSPECIFIED;
00205     #ifdef _WIN32
00206       struct _timeb timebuffer;
00207       _ftime(&timebuffer);
00208       // Hack what should be solved better...
00209       BN_set_word(bnTime,timebuffer.time);
00210       BN_mul_word(bnTime,1000);
00211       BN_add_word(bnTime,timebuffer.millitm);
00212       // end of hack..
00213       return E_SUCCESS;
00214     #else //we dont use ftime due to a bug in glibc2.0
00215     //we use gettimeofday() in order to get the millis...
00216       struct timeval tv;
00217       gettimeofday(&tv,NULL); //getting millis...
00218       BN_set_word(bnTime,tv.tv_sec);
00219       BN_mul_word(bnTime,1000);
00220       BN_add_word(bnTime,tv.tv_usec/1000);
00221       return E_SUCCESS;
00222     #endif
00223   }*/
00224 
00225 SINT32 getcurrentTime(timespec& t)
00226   {
00227     #ifdef _WIN32
00228       timeb timebuffer;
00229       ftime(&timebuffer);
00230       /* Hack what should be solved better...*/
00231       t.tv_sec=timebuffer.time;
00232       t.tv_nsec=timebuffer.millitm*1000000;
00233       /* end of hack..*/
00234       return E_SUCCESS;
00235     #else //we dont use ftime due to a bug in glibc2.0
00236     //we use gettimeofday() in order to get the millis...
00237       struct timeval tv;
00238       gettimeofday(&tv,NULL); //getting millis...
00239       t.tv_sec=tv.tv_sec;
00240       t.tv_nsec=tv.tv_usec*1000;
00241       return E_SUCCESS;
00242     #endif
00243   }
00244 
00250 SINT32 getcurrentTimeMillis(UINT64& u64Time)
00251   {
00252     #ifdef _WIN32
00253       timeb timebuffer;
00254       ftime(&timebuffer);
00255       /* Hack what should be solved better...*/
00256       u64Time=((UINT64)timebuffer.time)*1000+((UINT64)timebuffer.millitm);
00257       /* end of hack..*/
00258       return E_SUCCESS;
00259     #else //we dont use ftime due to a bug in glibc2.0
00260     //we use gettimeofday() in order to get the millis...
00261       struct timeval tv;
00262       gettimeofday(&tv,NULL); //getting millis...
00263       #ifdef HAVE_NATIVE_UINT64
00264         u64Time=((UINT64)tv.tv_sec)*1000+((UINT64)tv.tv_usec)/1000;
00265         return E_SUCCESS;
00266       #else
00267         return E_UNKNOWN;
00268       #endif
00269     #endif
00270   }
00271 
00278 SINT32 getcurrentTimeMicros(UINT64& u64Time)
00279   {
00280     #ifdef _WIN32
00281       timeb timebuffer;
00282       ftime(&timebuffer);
00283       /* Hack what should be solved better...*/
00284       u64Time=((UINT64)timebuffer.time)*1000000+((UINT64)timebuffer.millitm)*1000;
00285       /* end of hack..*/
00286       return E_SUCCESS;
00287     #else //we dont use ftime due to a bug in glibc2.0
00288     //we use gettimeofday() in order to get the millis...
00289       struct timeval tv;
00290       gettimeofday(&tv,NULL); //getting millis...
00291       #ifdef HAVE_NATIVE_UINT64
00292         u64Time=((UINT64)tv.tv_sec)*1000000+((UINT64)tv.tv_usec);
00293         return E_SUCCESS;
00294       #else
00295         return E_UNKNOWN;
00296       #endif
00297     #endif
00298   }
00299 
00300 SINT32 initRandom()
00301   {
00302     #if _WIN32
00303       RAND_screen();
00304     #else
00305       #ifndef __linux
00306         unsigned char randbuff[255];
00307         getcurrentTime(*((timespec*)randbuff));
00308         RAND_seed(randbuff,sizeof(randbuff));
00309       #endif
00310     #endif
00311     return E_SUCCESS;
00312   }
00313 
00314 /*
00315  * compares date1 with date2. Note: only the date is compared, not the time
00316  * returns:
00317  *  -1 if date1 < date2
00318  *   0 if date1 == date2
00319  *   1 if date1 > date2
00320  */
00321 SINT32 compDate(struct tm *date1, struct tm *date2)
00322 {
00323   //year
00324   if(date1->tm_year != date2->tm_year)
00325   {
00326     return (date1->tm_year < date2->tm_year) ? -1 : 1;
00327   }
00328   if(date1->tm_mon != date2->tm_mon)
00329   {
00330     return (date1->tm_mon < date2->tm_mon) ? -1 : 1;
00331   }
00332   if(date1->tm_mday != date2->tm_mday)
00333   {
00334     return (date1->tm_mday < date2->tm_mday) ? -1 : 1;
00335   }
00336   return 0;
00337 }
00338 
00344 SINT32 getRandom(UINT32* val)
00345   {
00346     ASSERT(val!=NULL,"VAL should be not NULL");
00347     if(RAND_bytes((UINT8*)val,4)!=1&&
00348        RAND_pseudo_bytes((UINT8*)val,4)<0)
00349         return E_UNKNOWN;
00350     return E_SUCCESS;
00351   }
00352 
00353 SINT32 getRandom(UINT64* val)
00354   {
00355     ASSERT(val!=NULL,"VAL should be not NULL");
00356     if(RAND_bytes((UINT8*)val,sizeof(UINT64))!=1&&
00357        RAND_pseudo_bytes((UINT8*)val,sizeof(UINT64))<0)
00358         return E_UNKNOWN;
00359     return E_SUCCESS;
00360   }
00361 
00368 SINT32 getRandom(UINT8* buff,UINT32 len)
00369   {
00370     ASSERT(buff!=NULL,"BUFF should be not NULL")
00371     if(RAND_bytes(buff,len)!=1&&
00372        RAND_pseudo_bytes(buff,len)<0)
00373       return E_UNKNOWN;
00374     return E_SUCCESS;
00375   }
00376 
00378 SINT32 msSleep(UINT32 ms)
00379   {//Do not us usleep for this --> because it doesnt seam to work on irix, multithreaded
00380     #ifdef _WIN32
00381       Sleep(ms);
00382     #else
00383       struct timespec req;
00384       struct timespec rem;
00385       req.tv_sec=ms/1000;
00386       req.tv_nsec=(ms%1000)*1000000;
00387       while(nanosleep(&req,&rem)==-1)
00388         {
00389           req.tv_sec=rem.tv_sec;
00390           req.tv_nsec=rem.tv_nsec;
00391         }
00392     #endif
00393     return E_SUCCESS;
00394   }
00395 
00397 SINT32 sSleep(UINT32 sec)
00398   {
00399     #ifdef _WIN32
00400       Sleep(sec*1000);
00401     #else
00402       struct timespec req;
00403       struct timespec rem;
00404       req.tv_sec=sec;
00405       req.tv_nsec=0;
00406       while(nanosleep(&req,&rem)==-1)
00407         {
00408           req.tv_sec=rem.tv_sec;
00409           req.tv_nsec=rem.tv_nsec;
00410         }
00411     #endif
00412     return E_SUCCESS;
00413   }
00414 
00415 UINT32 getMemoryUsage()
00416   {
00417 #ifndef _WIN32
00418     struct rusage usage_self;
00419     if(getrusage(RUSAGE_SELF,&usage_self)==-1)
00420       return 0;
00421     struct rusage usage_children;
00422     if(getrusage(RUSAGE_CHILDREN,&usage_children)==-1)
00423       return 0;
00424     return usage_self.ru_idrss+usage_children.ru_idrss;
00425 #else
00426   return 0;
00427 #endif
00428   }
00429 
00430 SINT32 getDOMChildByName(const DOMNode* pNode,const char * const name,DOMElement* & child,bool deep)
00431   {
00432     return getDOMChildByName(pNode,name,(DOMNode*&)child,deep);
00433   }
00434 SINT32 getDOMChildByName(const DOMNode* pNode,const XMLCh* const name,DOMNode* & a_child,bool deep)
00435   {
00436     a_child=NULL;
00437     if(pNode==NULL)
00438       return E_UNKNOWN;
00439     DOMNode *pChild=pNode->getFirstChild();
00440     while(pChild!=NULL)
00441       {
00442         if(XMLString::equals(pChild->getNodeName(),name))
00443           {
00444             a_child=pChild;
00445             return E_SUCCESS;
00446           }
00447         if(deep)
00448           {
00449             if(getDOMChildByName(pChild,name,a_child,deep)==E_SUCCESS)
00450               return E_SUCCESS;
00451           }
00452         pChild=pChild->getNextSibling();
00453       }
00454     return E_UNKNOWN;
00455   }
00456 
00457 SINT32 getDOMChildByName(const DOMNode* pNode,const char* const name,DOMNode* & a_child,bool deep)
00458   {
00459     a_child=NULL;
00460     if(pNode==NULL)
00461       return E_UNKNOWN;
00462     XMLCh* tmpName=XMLString::transcode((const char * const)name);
00463     SINT32 ret=getDOMChildByName(pNode,tmpName,a_child,deep);
00464     XMLString::release(&tmpName);
00465     return ret;
00466   }
00467 
00468 SINT32 getSignatureElements(DOMNode* parent, DOMNode** signatureNodes, UINT32* length)
00469 {
00470   if(parent == NULL)
00471   {
00472     return E_UNKNOWN;
00473   }
00474 
00475   DOMNode* child = parent->getFirstChild();
00476   UINT32 count = 0;
00477 
00478   while(child != NULL)
00479   {
00480     if(XMLString::equals(child->getNodeName(), XMLString::transcode("Signature")))
00481     {
00482       if(count < *length)
00483       {
00484         signatureNodes[count] = child;
00485         count++;
00486       }
00487       else
00488       {
00489         return E_UNKNOWN;
00490       }
00491     }
00492     child = child->getNextSibling();
00493   }
00494   *length = count;
00495 
00496   return E_SUCCESS;
00497 }
00498 
00504 SINT32 integrateDOMNode(const DOMNode *srcNode, DOMNode *dstNode, bool recursive, bool replace)
00505 {
00506   if( (srcNode->getNodeType() != DOMNode::ELEMENT_NODE) ||
00507     (dstNode->getNodeType() != DOMNode::ELEMENT_NODE) )
00508   {
00509     return E_UNKNOWN;
00510   }
00511 
00512   DOMNodeList *srcList = srcNode->getChildNodes();
00513   XERCES_CPP_NAMESPACE::DOMDocument *srcOwnerDoc = srcNode->getOwnerDocument();
00514   XERCES_CPP_NAMESPACE::DOMDocument *dstOwnerDoc = dstNode->getOwnerDocument();
00515 
00516   short int pos =
00517 #if _XERCES_VERSION >= 30001
00518     srcNode->compareDocumentPosition(dstNode);
00519 #else
00520     srcNode->compareTreePosition(dstNode);
00521 #endif
00522   if( (pos & INTEGRATE_NOT_ALLOWED_POSITIONS)  )
00523   {
00524     CAMsg::printMsg(LOG_ERR,"integrate impossible due to illegal tree positions, (pos: 0x%x)\n", pos);
00525     return E_UNKNOWN;
00526   }
00527 
00528   if(srcList->getLength() == 0)
00529   {
00530     return E_SUCCESS;
00531   }
00532 
00533   DOMElement *srcElem = (DOMElement *) srcNode;
00534   DOMElement *dstElem = (DOMElement *) dstNode;
00535 
00536   DOMNode *currSrcChild = NULL;
00537   XMLCh** nodeNames=new XMLCh*[srcList->getLength()];
00538   memset(nodeNames,0,sizeof(XMLCh*)*srcList->getLength());
00539   UINT32 nodeNamesIndex = 0;
00540   XMLCh *currSrcChildName = NULL;
00541 
00542   DOMNodeList *currSrcChildren = NULL;
00543   DOMNodeList *currDstChildren = NULL;
00544   bool nodeAlreadyFinished = false;
00545 
00546   for(XMLSize_t i = 0; i < srcList->getLength(); i++)
00547   {
00548     currSrcChild = srcList->item(i);
00549     if( currSrcChild->getNodeType() == DOMNode::ELEMENT_NODE )
00550     {
00551       nodeAlreadyFinished = false;
00552       currSrcChildName = (XMLCh *) ((DOMElement *) currSrcChild)->getTagName();
00553       /*UINT8 *tn = (UINT8 *) XMLString::transcode(currSrcChildName);
00554       CAMsg::printMsg(LOG_DEBUG,"handle %s\n", tn);
00555       XMLString::release(&tn);*/
00556       for(UINT32 i = 0; i < nodeNamesIndex; i++ )
00557       {
00558         if(XMLString::equals(currSrcChildName, nodeNames[i]))
00559         {
00560           nodeAlreadyFinished = true;
00561           break;
00562         }
00563       }
00564 
00565       if(nodeAlreadyFinished)
00566       {
00567         continue;
00568       }
00569       currDstChildren = dstElem->getElementsByTagName(currSrcChildName);
00570       currSrcChildren = srcElem->getElementsByTagName(currSrcChildName);
00571 
00572       for(XMLSize_t j = 0;
00573         j < currSrcChildren->getLength(); j++ )
00574       {
00575         if(j >= currDstChildren->getLength())
00576         {
00577           if( (dstOwnerDoc != NULL) && (srcOwnerDoc != dstOwnerDoc) )
00578           {
00579             dstNode->appendChild(dstOwnerDoc->importNode(currSrcChildren->item(j), true));
00580           }
00581           else
00582           {
00583             dstNode->appendChild(currSrcChildren->item(j)->cloneNode(true));
00584           }
00585         }
00586         else if(replace)
00587         {
00588           if( (dstOwnerDoc != NULL) && (srcOwnerDoc != dstOwnerDoc) )
00589           {
00590             dstElem->replaceChild(
00591               dstOwnerDoc->importNode(currSrcChildren->item(j),true),
00592               currDstChildren->item(j));
00593           }
00594           else
00595           {
00596             dstElem->replaceChild(
00597               dstOwnerDoc->cloneNode(currSrcChildren->item(j)),
00598               currDstChildren->item(j));
00599           }
00600           continue;
00601         }
00602         else if(recursive)
00603         {
00604           if(currSrcChildren->item(j)->hasChildNodes() )
00605           {
00606             integrateDOMNode(currSrcChildren->item(j), currDstChildren->item(j), true, false);
00607           }
00608         }
00609         nodeNames[nodeNamesIndex++] = currSrcChildName;
00610       }
00611     }
00612   }
00613   delete[] nodeNames;
00614   return E_SUCCESS;
00615 }
00616 
00617 bool equals(const XMLCh* const e1,const char* const e2)
00618   {
00619     XMLCh* e3=XMLString::transcode(e2);
00620     bool ret=XMLString::equals(e1,e3);
00621     XMLString::release(&e3);
00622     return ret;
00623   }
00624 
00625 XercesDOMParser* theDOMParser=NULL;
00626 CAMutex* theParseDOMDocumentLock = NULL;
00627 
00628 void initDOMParser()
00629 {
00630   theParseDOMDocumentLock = new CAMutex();
00631   theDOMParser = new XercesDOMParser();
00632 }
00633 
00634 XERCES_CPP_NAMESPACE::DOMDocument* parseDOMDocument(const UINT8* const buff, UINT32 len)
00635   {
00636     theParseDOMDocumentLock->lock();
00637     MemBufInputSource in(buff,len,"tmpBuff");
00638     theDOMParser->parse(in);
00639     XERCES_CPP_NAMESPACE::DOMDocument* ret=NULL;
00640     if(theDOMParser->getErrorCount()==0)
00641       ret=theDOMParser->adoptDocument();
00642     theParseDOMDocumentLock->unlock();
00643     return ret;
00644   }
00645 
00649 XERCES_CPP_NAMESPACE::DOMDocument* parseDOMDocument(const UINT8* const pathOrURL)
00650 {
00651   theParseDOMDocumentLock->lock();
00652 
00653   theDOMParser->parse((const char *const) pathOrURL);
00654   XERCES_CPP_NAMESPACE::DOMDocument* ret=NULL;
00655   if(theDOMParser->getErrorCount()==0)
00656   {
00657     ret=theDOMParser->adoptDocument();
00658   }
00659   theParseDOMDocumentLock->unlock();
00660   return ret;
00661 }
00662 
00663 void releaseDOMParser()
00664   {
00665     if( theParseDOMDocumentLock!=NULL)
00666       {
00667         theParseDOMDocumentLock->lock();
00668         delete theDOMParser;
00669         theDOMParser=NULL;
00670         theParseDOMDocumentLock->unlock();
00671         delete theParseDOMDocumentLock;
00672         theParseDOMDocumentLock=NULL;
00673       }
00674   }
00675 
00676 SINT32 getNodeName(const DOMNode * const pElem, UINT8* value,UINT32* valuelen)
00677 {
00678   ASSERT(value!=NULL,"Value is null");
00679   ASSERT(valuelen!=NULL,"ValueLen is null");
00680   ASSERT(pElem!=NULL,"Element is NULL");
00681   if(pElem==NULL)
00682     return E_UNKNOWN;
00683 
00684   UINT32 spaceLeft=*valuelen;
00685   *valuelen=0;
00686   const XMLCh* str=pElem->getNodeName();
00687   char* tmpStr=XMLString::transcode(str);
00688   UINT32 tmpStrLen=strlen(tmpStr);
00689   if(tmpStrLen>=spaceLeft)
00690     {
00691       *valuelen=tmpStrLen+1;
00692       XMLString::release(&tmpStr);
00693       return E_SPACE;
00694     }
00695   memcpy(value+(*valuelen),tmpStr,tmpStrLen);
00696   *valuelen+=tmpStrLen;
00697   XMLString::release(&tmpStr);
00698   value[*valuelen] = 0;
00699   return E_SUCCESS;
00700 }
00701 
00715 SINT32 getDOMElementValue(const DOMNode * const pElem,UINT8* value,UINT32* valuelen)
00716   {
00717     ASSERT(value!=NULL,"Value is null");
00718     ASSERT(valuelen!=NULL,"ValueLen is null");
00719     ASSERT(pElem!=NULL,"Element is NULL");
00720     if(pElem==NULL)
00721       return E_UNKNOWN;
00722     DOMNode*  pText=pElem->getFirstChild();
00723     UINT32 spaceLeft=*valuelen;
00724     *valuelen=0;
00725     while(pText!=NULL)
00726       {
00727         if(pText->getNodeType()==DOMNode::TEXT_NODE)
00728           {
00729             const XMLCh* str=pText->getNodeValue();
00730             char* tmpStr=XMLString::transcode(str);
00731             UINT32 tmpStrLen=strlen(tmpStr);
00732             if(tmpStrLen>=spaceLeft)
00733               {
00734                 *valuelen=tmpStrLen+1;
00735                 XMLString::release(&tmpStr);
00736                 return E_SPACE;
00737               }
00738             memcpy(value+(*valuelen),tmpStr,tmpStrLen);
00739             *valuelen+=tmpStrLen;
00740             spaceLeft-=tmpStrLen;
00741             XMLString::release(&tmpStr);
00742           }
00743         pText=pText->getNextSibling();
00744       }
00745     value[*valuelen]=0;
00746     return E_SUCCESS;
00747   }
00748 
00749 SINT32 getDOMElementAttribute(const DOMNode * const elem,const char* attrName,UINT8* value,UINT32* len)
00750   {
00751     if(elem==NULL||attrName==NULL||value==NULL||len==NULL||elem->getNodeType()!=DOMNode::ELEMENT_NODE)
00752       return E_UNKNOWN;
00753     XMLCh* name=XMLString::transcode(attrName);
00754     const XMLCh* tmpCh=((DOMElement*)elem)->getAttribute(name);
00755     XMLString::release(&name);
00756     char* tmpStr=XMLString::transcode(tmpCh);
00757     UINT32 l=strlen(tmpStr);
00758     if(l>=*len)
00759       {
00760         XMLString::release(&tmpStr);
00761         return E_SPACE;
00762       }
00763     *len=l;
00764     memcpy(value,tmpStr,l+1);
00765     XMLString::release(&tmpStr);
00766     return E_SUCCESS;
00767   }
00768 
00769 SINT32 getDOMElementAttribute(const DOMNode * const elem,const char* attrName,SINT32* value)
00770   {
00771     UINT8 val[50];
00772     UINT32 len=50;
00773     if(getDOMElementAttribute(elem,attrName,val,&len)!=E_SUCCESS)
00774       return E_UNKNOWN;
00775     *value=atol((char*)val);
00776     return E_SUCCESS;
00777   }
00778 
00779 DOMElement* createDOMElement(XERCES_CPP_NAMESPACE::DOMDocument* pOwnerDoc,const char * const name)
00780   {
00781     XMLCh* n=XMLString::transcode(name);
00782     DOMElement* ret=pOwnerDoc->createElement(n);
00783     XMLString::release(&n);
00784     return ret;
00785   }
00786 
00787 DOMText* createDOMText(XERCES_CPP_NAMESPACE::DOMDocument* pOwnerDoc,const char * const text)
00788   {
00789     XMLCh* t=XMLString::transcode(text);
00790     DOMText* ret= pOwnerDoc->createTextNode(t);
00791     XMLString::release(&t);
00792     return ret;
00793   }
00794 
00795 SINT32 setDOMElementAttribute(DOMNode* pElem,const char* attrName,const UINT8* value)
00796 {
00797   if(pElem==NULL||pElem->getNodeType()!=DOMNode::ELEMENT_NODE||attrName==NULL||value==NULL)
00798     return E_UNKNOWN;
00799   XMLCh* name=XMLString::transcode(attrName);
00800   XMLCh* val=XMLString::transcode((const char*)value);
00801   ((DOMElement*)pElem)->setAttribute(name,val);
00802   XMLString::release(&name);
00803   XMLString::release(&val);
00804   return E_SUCCESS;
00805 }
00806 
00807 SINT32 setCurrentTimeMilliesAsDOMAttribute(DOMNode *pElem)
00808 {
00809     if( pElem == NULL || pElem->getNodeType() != DOMNode::ELEMENT_NODE )
00810     {
00811       return E_UNKNOWN;
00812     }
00813     UINT64 currentMillis;
00814     getcurrentTimeMillis(currentMillis);
00815     UINT8 tmpStrCurrentMillis[50];
00816     print64(tmpStrCurrentMillis,currentMillis);
00817     setDOMElementAttribute
00818       (pElem,UNIVERSAL_ATTRIBUTE_LAST_UPDATE, tmpStrCurrentMillis );
00819     return E_SUCCESS;
00820 
00821 }
00822 
00823 //if not null the returned char pointer must be explicitely freed by the caller with 'delete []'
00824 UINT8 *getTermsAndConditionsTemplateRefId(DOMNode *tcTemplateRoot)
00825 {
00826   UINT32 tmpTypeLen = TMP_BUFF_SIZE;
00827   UINT8 tmpType[TMP_BUFF_SIZE];
00828 
00829   UINT32 tmpLocaleLen = TMP_LOCALE_SIZE;
00830   UINT8 tmpLocale[TMP_LOCALE_SIZE];
00831 
00832   UINT32 tmpDateLen = TMP_DATE_SIZE;
00833   UINT8 tmpDate[TMP_DATE_SIZE];
00834   memset(tmpDate, 0, TMP_DATE_SIZE);
00835   memset(tmpLocale, 0, TMP_LOCALE_SIZE);
00836   memset(tmpType, 0, TMP_BUFF_SIZE);
00837 
00838   //TODO replace magic strings
00839   if(getDOMElementAttribute(tcTemplateRoot, "type", tmpType, &tmpTypeLen) != E_SUCCESS)
00840   {
00841     return NULL;
00842   }
00843   else if(getDOMElementAttribute(tcTemplateRoot, "locale", tmpLocale, &tmpLocaleLen) != E_SUCCESS)
00844   {
00845     return NULL;
00846   }
00847   else if(getDOMElementAttribute(tcTemplateRoot, "date", tmpDate, &tmpDateLen) != E_SUCCESS)
00848   {
00849     return NULL;
00850   }
00851   if( (tmpTypeLen == 0) ||
00852     (tmpLocaleLen == 0) ||
00853     (tmpDateLen) == 0)
00854   {
00855     return NULL;
00856   }
00857   //reserve 2 more chars for the both underlines between the fields ...
00858   size_t templateRefIdLen = tmpTypeLen+tmpLocaleLen+tmpDateLen+2;
00859   //... and 1 more for zero termination.
00860   char *templateRefId = new char[templateRefIdLen+1];
00861   memset(templateRefId, 0, templateRefIdLen+1);
00862   snprintf(templateRefId, templateRefIdLen+1, "%s_%s_%s", (char *) tmpType, (char *) tmpLocale, (char *) tmpDate);
00863 
00864   return (UINT8 *) templateRefId;
00865 }
00866 
00867 #ifndef ONLY_LOCAL_PROXY
00868 DOMNodeList* getElementsByTagName(DOMElement* pElem,const char* const name)
00869   {
00870     XMLCh* tmpCh=XMLString::transcode(name);
00871     DOMNodeList* ret=pElem->getElementsByTagName(tmpCh);
00872     XMLString::release(&tmpCh);
00873     return ret;
00874   }
00875 
00876 SINT32 getLastDOMChildByName(const DOMNode* pNode,const char * const name,DOMElement* & a_child)
00877   {
00878     return getLastDOMChildByName(pNode,name,(DOMNode*&)a_child);
00879   }
00880 
00881 XERCES_CPP_NAMESPACE::DOMDocument* createDOMDocument()
00882   {
00883     DOMImplementation* pImpl=DOMImplementation::getImplementation();
00884     return pImpl->createDocument();
00885   }
00886 
00887 SINT32 setDOMElementValue(DOMElement* pElem, UINT32 value)
00888   {
00889     UINT8 tmp[11];
00890     memset(tmp, 0, 11);
00891     snprintf((char*)tmp, 10, "%u", value);
00892     setDOMElementValue(pElem,tmp);
00893     return E_SUCCESS;
00894   }
00895 
00896 SINT32 setDOMElementValue(DOMElement* pElem, SINT32 value)
00897   {
00898     //One more char for the sign of negative numbers
00899     UINT8 tmp[12];
00900     memset(tmp, 0, 12);
00901     snprintf((char*)tmp, 11, "%d", value);
00902     setDOMElementValue(pElem,tmp);
00903     return E_SUCCESS;
00904   }
00905 
00906 SINT32 setDOMElementValue(DOMElement* pElem,double floatValue)
00907   {
00908     char tmp[400];
00909     snprintf(tmp,400, "%.2f", floatValue);
00910     setDOMElementValue(pElem,(UINT8 *)tmp);
00911     return E_SUCCESS;
00912   }
00913 
00914 
00919 SINT32 setDOMElementValue(DOMElement* pElem, const UINT64 text)
00920   {
00921     UINT8 tmp[32];
00922     memset(tmp, 0, 32);
00923     print64(tmp,text);
00924     setDOMElementValue(pElem,tmp);
00925     return E_SUCCESS;
00926   }
00927 
00928 
00929 SINT32 setDOMElementValue(DOMElement* pElem,const UINT8* value)
00930   {
00931     XMLCh* val=XMLString::transcode((const char *)value);
00932     DOMText* pText=pElem->getOwnerDocument()->createTextNode(val);
00933     XMLString::release(&val);
00934     //Remove all "old" text Elements...
00935     DOMNode* pChild=pElem->getFirstChild();
00936     while(pChild!=NULL)
00937     {
00938       if(pChild->getNodeType()==DOMNode::TEXT_NODE)
00939         {
00940           DOMNode* n=pElem->removeChild(pChild);
00941           if (n != NULL)
00942           {
00943             n->release();
00944             n = NULL;
00945           }
00946         }
00947       pChild=pChild->getNextSibling();
00948     }
00949     pElem->appendChild(pText);
00950     return E_SUCCESS;
00951   }
00952 
00953 SINT32 setDOMElementAttribute(DOMNode* pElem, const char* attrName, UINT64 value)
00954 {
00955   UINT8 tmp[50];
00956   print64(tmp, value);
00957   return setDOMElementAttribute(pElem, attrName, tmp);
00958 }
00959 
00960 SINT32 setDOMElementAttribute(DOMNode* pElem, const char* attrName, SINT64 value)
00961 {
00962   UINT8 tmp[50];
00963   memset(tmp, 0, 50);
00964   snprintf((char *) tmp, 50, "%lld", value);
00965   return setDOMElementAttribute(pElem, attrName, tmp);
00966 }
00967 
00968 SINT32 setDOMElementAttribute(DOMNode* pElem,const char* attrName, SINT32 value)
00969 {
00970   UINT8 tmp[10];
00971   sprintf((char*)tmp, "%i", value);
00972   return setDOMElementAttribute(pElem, attrName, tmp);
00973 }
00974 
00975 SINT32 setDOMElementAttribute(DOMNode* pElem,const char* attrName, UINT32 value)
00976 {
00977   UINT8 tmp[10];
00978   sprintf((char*)tmp, "%u", value);
00979   return setDOMElementAttribute(pElem, attrName, tmp);
00980 }
00981 
00982 SINT32 setDOMElementAttribute(DOMNode* pElem, const char* attrName, bool value)
00983 {
00984   return setDOMElementAttribute(pElem, attrName,
00985       ((UINT8*) (value ? STR_VALUE_TRUE : STR_VALUE_FALSE)));
00986 }
00987 
00988 SINT32 setDOMElementValue(DOMElement* pElem, bool value)
00989 {
00990   return setDOMElementValue(pElem,((UINT8*) (value ? STR_VALUE_TRUE : STR_VALUE_FALSE)));
00991 }
00992 
00993 SINT32 getDOMElementAttribute(const DOMNode * const elem,const char* attrName,SINT64& value)
00994 {
00995   UINT8 val[50];
00996   UINT32 len=50;
00997   if(getDOMElementAttribute(elem,attrName,val,&len)!=E_SUCCESS)
00998   {
00999     return E_UNKNOWN;
01000   }
01001   if(parseS64(val,value)!=E_SUCCESS)
01002   {
01003     return E_UNKNOWN;
01004   }
01005   return E_SUCCESS;
01006 }
01007 
01008 SINT32 getDOMElementAttribute(const DOMNode * const elem,const char* attrName, UINT64& value)
01009 {
01010   UINT8 val[50];
01011   UINT32 len=50;
01012   if(getDOMElementAttribute(elem,attrName,val,&len)!=E_SUCCESS)
01013   {
01014     return E_UNKNOWN;
01015   }
01016   if(parseU64(val,value)!=E_SUCCESS)
01017   {
01018     return E_UNKNOWN;
01019   }
01020   return E_SUCCESS;
01021 }
01022 
01023 SINT32 getDOMElementAttribute(const DOMNode * const elem,const char* attrName,UINT32& value)
01024 {
01025   UINT8 val[50];
01026   UINT32 len=50;
01027   if(getDOMElementAttribute(elem,attrName,val,&len)!=E_SUCCESS)
01028     return E_UNKNOWN;
01029   long l=atol((char*)val);
01030   if(l<0)
01031     return E_UNKNOWN;
01032   value=(UINT32)l;
01033   return E_SUCCESS;
01034 }
01035 
01036 SINT32 getDOMElementAttribute(const DOMNode * const elem,const char* attrName,bool& value)
01037 {
01038   UINT8 val[50];
01039   UINT32 len=50;
01040   if(getDOMElementAttribute(elem,attrName,val,&len) != E_SUCCESS)
01041   {
01042     return E_UNKNOWN;
01043   }
01044   SINT32 ret = E_UNSPECIFIED;
01045   if(strncasecmp((char*)val, STR_VALUE_TRUE, strlen(STR_VALUE_TRUE)) == 0)
01046   {
01047     value = true;
01048     ret = E_SUCCESS;
01049   }
01050   else if(strncasecmp((char*)val, STR_VALUE_FALSE, strlen(STR_VALUE_FALSE)) == 0)
01051   {
01052     value = false;
01053     ret = E_SUCCESS;
01054   }
01055   return ret;
01056 }
01057 
01058 SINT32 getLastDOMChildByName(const DOMNode* pNode,const char* const name,DOMNode* & a_child)
01059 {
01060   a_child=NULL;
01061   if(pNode==NULL)
01062     return E_UNKNOWN;
01063   XMLCh* tmpName=XMLString::transcode((const char * const)name);
01064   SINT32 ret=getLastDOMChildByName(pNode,tmpName,a_child);
01065   XMLString::release(&tmpName);
01066   return ret;
01067 }
01068 
01069 SINT32 getLastDOMChildByName(const DOMNode* pNode,const XMLCh* const name,DOMNode* & a_child)
01070 {
01071   a_child=NULL;
01072   if(pNode==NULL)
01073     {
01074       return E_UNKNOWN;
01075     }
01076   DOMNode* pChild;
01077   pChild=pNode->getLastChild();
01078   while(pChild!=NULL)
01079     {
01080       if(XMLString::equals(pChild->getNodeName(),name))
01081         {
01082           a_child = pChild; // found a child
01083           return E_SUCCESS;
01084         }
01085       pChild=pChild->getPreviousSibling();
01086     }
01087   return E_UNKNOWN;
01088 }
01089 
01090 
01091 
01092 
01093 SINT32 getDOMElementValue(const DOMElement* const pElem,UINT32* value)
01094 {
01095   ASSERT(value!=NULL,"Value is null");
01096   ASSERT(pElem!=NULL,"Element is NULL");
01097   UINT8 buff[255];
01098   UINT32 buffLen=255;
01099   if(getDOMElementValue(pElem,buff,&buffLen)!=E_SUCCESS)
01100     return E_UNKNOWN;
01101   *value=atol((char*)buff);
01102 
01103   return E_SUCCESS;
01104 }
01105 
01106 SINT32 getDOMElementValue(const DOMElement* const pElem,SINT32* value)
01107 {
01108   ASSERT(value!=NULL,"Value is null");
01109   ASSERT(pElem!=NULL,"Element is NULL");
01110   UINT8 buff[255];
01111   UINT32 buffLen=255;
01112   if(getDOMElementValue(pElem,buff,&buffLen)!=E_SUCCESS)
01113     return E_UNKNOWN;
01114   *value=atol((char*)buff);
01115 
01116   return E_SUCCESS;
01117 }
01118 
01119 SINT32 getDOMElementValue(const DOMElement* const pElem,double* value)
01120 {
01121   ASSERT(value!=NULL,"Value is null");
01122   ASSERT(pElem!=NULL,"Element is NULL");
01123   UINT8 buff[255];
01124   UINT32 buffLen=255;
01125   if(getDOMElementValue(pElem,buff,&buffLen)!=E_SUCCESS)
01126     return E_UNKNOWN;
01127   *value=atof((char*)buff);
01128 
01129   return E_SUCCESS;
01130 }
01131 
01132 
01133 SINT32 getDOMElementValue(const DOMElement* pElem,UINT32& value, UINT32 defaultValue)
01134 {
01135   UINT32 v;
01136   if(getDOMElementValue(pElem,&v)!=E_SUCCESS)
01137     {
01138     value=defaultValue;
01139     }
01140   else
01141     value=v;
01142   return E_SUCCESS;
01143 }
01144 
01145 SINT32 getDOMElementValue(const DOMElement* pElem, UINT64 &value)
01146 {
01147   ASSERT(pElem!=NULL, "Element is NULL");
01148   UINT8 buf[256];
01149   UINT32 bufLen = 256;
01150   if(getDOMElementValue(pElem,buf,&bufLen)!=E_SUCCESS)
01151   {
01152     return E_UNKNOWN;
01153   }
01154   if(parseU64(buf, value)!=E_SUCCESS)
01155   {
01156     return E_UNKNOWN;
01157   }
01158 
01159   return E_SUCCESS;
01160 }
01161 
01162 SINT32 getDOMElementValue(const DOMElement* const pElem, SINT64 &value)
01163 {
01164   ASSERT(pElem!=NULL, "Element is NULL");
01165   UINT8 buf[256];
01166   UINT32 bufLen = 256;
01167   if(getDOMElementValue(pElem,buf,&bufLen)!=E_SUCCESS)
01168   {
01169     return E_UNKNOWN;
01170   }
01171   if(parseS64(buf, value)!=E_SUCCESS)
01172   {
01173     return E_UNKNOWN;
01174   }
01175   return E_SUCCESS;
01176 }
01177 
01178 
01179 SINT32 getDOMElementValue(const DOMElement* const pElem,UINT16* value)
01180 {
01181   UINT32 tmp;
01182   if(getDOMElementValue(pElem,&tmp)!=E_SUCCESS)
01183     return E_UNKNOWN;
01184   if(tmp>0xFFFF)
01185     return E_UNKNOWN;
01186   *value=(UINT16)tmp;
01187   return E_SUCCESS;
01188 }
01189 
01190 
01191 void __encryptKey(UINT8* key,UINT32 keylen,UINT8* outBuff,UINT32* outLen,CAASymCipher* pRSA)
01192 {
01193   UINT8 tmpBuff[1024];
01194   memset(tmpBuff,0,sizeof(tmpBuff));
01195   memcpy(tmpBuff+128-keylen,key,keylen);
01196   pRSA->encrypt(tmpBuff,tmpBuff);
01197   CABase64::encode(tmpBuff,128,outBuff,outLen);
01198   outBuff[*outLen]=0;
01199 }
01200 
01201 SINT32 encodeXMLEncryptedKey(UINT8* key,UINT32 keylen, UINT8* xml, UINT32* xmllen,CAASymCipher* pRSA)
01202 {
01203 #define XML_ENCODE_KEY_TEMPLATE "<EncryptedKey><EncryptionMethod Algorithm=\"RSA\"/><CipherData><CipherValue>%s</CipherValue></CipherData></EncryptedKey>"
01204   UINT8 tmpBuff[1024];
01205   UINT32 len=1024;
01206   __encryptKey(key,keylen,tmpBuff,&len,pRSA);
01207   sprintf((char*)xml,XML_ENCODE_KEY_TEMPLATE,tmpBuff);
01208   *xmllen=strlen((char*)xml);
01209   return E_SUCCESS;
01210 }
01211 
01212 SINT32 encodeXMLEncryptedKey(UINT8* key,UINT32 keylen, DOMElement* & elemRootEncodedKey,XERCES_CPP_NAMESPACE::DOMDocument* docOwner,CAASymCipher* pRSA)
01213 {
01214   elemRootEncodedKey=createDOMElement(docOwner,"EncryptedKey");
01215   DOMElement* elem1=createDOMElement(docOwner,"EncryptionMethod");
01216   setDOMElementAttribute(elem1,"Algorithm",(UINT8*)"RSA");
01217   elemRootEncodedKey->appendChild(elem1);
01218   DOMElement* elem2=createDOMElement(docOwner,"CipherData");
01219   elem1->appendChild(elem2);
01220   elem1=createDOMElement(docOwner,"CipherValue");
01221   elem2->appendChild(elem1);
01222   UINT8 tmpBuff[1024];
01223   UINT32 tmpLen=1024;
01224   __encryptKey(key,keylen,tmpBuff,&tmpLen,pRSA);
01225   setDOMElementValue(elem1,tmpBuff);
01226   return E_SUCCESS;
01227 }
01228 
01229 
01230 
01231 
01232 
01233 SINT32 decodeXMLEncryptedKey(UINT8* key,UINT32* keylen, const UINT8* const xml, UINT32 xmllen,CAASymCipher* pRSA)
01234 {
01235   XERCES_CPP_NAMESPACE::DOMDocument* pDoc=parseDOMDocument(xml,xmllen);
01236   if(pDoc == NULL)
01237   {
01238     return E_UNKNOWN;
01239   }
01240   DOMElement* root=pDoc->getDocumentElement();
01241   if(root == NULL)
01242   {
01243     return E_UNKNOWN;
01244   }
01245   SINT32 ret=decodeXMLEncryptedKey(key,keylen,root,pRSA);
01246   if (pDoc != NULL)
01247   {
01248     pDoc->release();
01249     pDoc = NULL;
01250   }
01251   return ret;
01252 }
01253 
01254 SINT32 decodeXMLEncryptedKey(UINT8* key,UINT32* keylen,const DOMNode* root,CAASymCipher* pRSA)
01255 {
01256   DOMNode* elemCipherValue=NULL;
01257   if(getDOMChildByName(root,"CipherValue",elemCipherValue,true)!=E_SUCCESS)
01258     return E_UNKNOWN;
01259   UINT8 buff[2048];
01260   UINT32 bufflen=2048;
01261   if(getDOMElementValue(elemCipherValue,buff,&bufflen)!=E_SUCCESS)
01262     return E_UNKNOWN;
01263   CABase64::decode(buff,bufflen,buff,&bufflen);
01264   pRSA->decrypt(buff,buff);
01265   for(SINT32 i=127;i>=0;i--)
01266     {
01267       if(buff[i]!=0)
01268         {
01269           if(i>32)
01270             *keylen=64;
01271           else if(i>16)
01272             *keylen=32;
01273           else
01274             *keylen=16;
01275         }
01276     }
01277   memcpy(key,buff+128-(*keylen),(*keylen));
01278   return E_SUCCESS;
01279 }
01280 
01299 SINT32 encryptXMLElement(DOMNode* node, CAASymCipher* pRSA)
01300 {
01301   XERCES_CPP_NAMESPACE::DOMDocument* doc=NULL;
01302   DOMNode* parent=NULL;
01303   if(node->getNodeType()==DOMNode::DOCUMENT_NODE)
01304     {
01305       doc=(XERCES_CPP_NAMESPACE::DOMDocument*)node;
01306       parent=doc;
01307       node=doc->getDocumentElement();
01308     }
01309   else
01310     {
01311       doc=node->getOwnerDocument();
01312       parent=node->getParentNode();
01313     }
01314   DOMElement* elemRoot=createDOMElement(doc,"EncryptedData");
01315   DOMElement* elemKeyInfo=createDOMElement(doc,"ds:KeyInfo");
01316   elemRoot->appendChild(elemKeyInfo);
01317   DOMElement* elemEncKey=createDOMElement(doc,"EncryptedKey");
01318   elemKeyInfo->appendChild(elemEncKey);
01319   DOMElement* elemCipherData=createDOMElement(doc,"CipherData");
01320   elemEncKey->appendChild(elemCipherData);
01321   DOMElement* elemCipherValue=createDOMElement(doc,"CipherValue");
01322   elemCipherData->appendChild(elemCipherValue);
01323   UINT8 key[32];
01324   getRandom(key,32);
01325   UINT8* pBuff=new UINT8[1000];
01326   UINT32 bufflen=255;
01327   pRSA->encryptOAEP(key,32,pBuff,&bufflen);
01328   UINT8* pOutBuff=new UINT8[1000];
01329   UINT32 outbufflen=255;
01330   CABase64::encode(pBuff,bufflen,pOutBuff,&outbufflen);
01331   pOutBuff[outbufflen]=0;
01332   setDOMElementValue(elemCipherValue,pOutBuff);
01333   delete[] pOutBuff;
01334   pOutBuff = NULL;
01335   delete[] pBuff;
01336   pBuff = NULL;
01337   CASymCipher *pSymCipher=new CASymCipher();
01338   pSymCipher->setKey(key,true);
01339   pSymCipher->setIVs(key+16);
01340   elemCipherData=createDOMElement(doc,"CipherData");
01341   elemRoot->appendChild(elemCipherData);
01342   elemCipherValue=createDOMElement(doc,"CipherValue");
01343   elemCipherData->appendChild(elemCipherValue);
01344   UINT8* b=DOM_Output::dumpToMem(node,&bufflen);
01345   outbufflen=bufflen+1000;
01346   pOutBuff=new UINT8[outbufflen];
01347   pSymCipher->encrypt1CBCwithPKCS7(b,bufflen,pOutBuff,&outbufflen);
01348   delete[] b;
01349   b = NULL;
01350   bufflen=outbufflen*3/2+1000;
01351   pBuff=new UINT8[bufflen];
01352   CABase64::encode(pOutBuff,outbufflen,pBuff,&bufflen);
01353   pBuff[bufflen]=0;
01354   setDOMElementValue(elemCipherValue,pBuff);
01355   delete[] pOutBuff;
01356   pOutBuff = NULL;
01357   delete[] pBuff;
01358   pBuff = NULL;
01359   if(parent->getNodeType()==DOMNode::DOCUMENT_NODE)
01360     {
01361       DOMNode* n=parent->removeChild(node);
01362       if (n != NULL)
01363       {
01364         n->release();
01365         n = NULL;
01366       }
01367       parent->appendChild(elemRoot);
01368     }
01369   else
01370     {
01371       DOMNode* n=parent->replaceChild(elemRoot,node);
01372       if (n != NULL)
01373       {
01374         n->release();
01375         n = NULL;
01376       }
01377     }
01378   return E_SUCCESS;
01379 }
01380 #endif //ONLY_LOCAL_PROXY
01381 
01401 UINT8* encryptXMLElement(UINT8* inbuff,UINT32 inlen,UINT32& outlen,CAASymCipher* pRSA)
01402 {
01403   const char* XML_ENC_TEMPLATE="<EncryptedData><ds:KeyInfo><EncryptedKey><CipherData><CipherValue>%s</CipherValue></CipherData></EncryptedKey></ds:KeyInfo><CipherData><CipherValue>%s</CipherValue></CipherData></EncryptedData>";
01404   UINT8 key[32];
01405   getRandom(key,32);
01406   UINT8 buff[1000];
01407   UINT32 bufflen=255;
01408   pRSA->encryptOAEP(key,32,buff,&bufflen);
01409   UINT8 keyoutbuff[1000];
01410   UINT32 keyoutbufflen=255;
01411   CABase64::encode(buff,bufflen,keyoutbuff,&keyoutbufflen);
01412   keyoutbuff[keyoutbufflen]=0;
01413   CASymCipher* pSymCipher=new CASymCipher();
01414   pSymCipher->setKey(key,true);
01415   pSymCipher->setIVs(key+16);
01416   UINT32 msgoutbufflen=inlen+1000;
01417   UINT8* msgoutbuff=new UINT8[msgoutbufflen];
01418   pSymCipher->encrypt1CBCwithPKCS7(inbuff,inlen,msgoutbuff,&msgoutbufflen);
01419   delete pSymCipher;
01420   pSymCipher = NULL;
01421   UINT32 encmsgoutbufflen=msgoutbufflen*3/2+1000;
01422   UINT8* encmsgoutbuff=new UINT8[encmsgoutbufflen];
01423   CABase64::encode(msgoutbuff,msgoutbufflen,encmsgoutbuff,&encmsgoutbufflen);
01424   delete[] msgoutbuff;
01425   msgoutbuff = NULL;
01426   encmsgoutbuff[encmsgoutbufflen]=0;
01427   msgoutbufflen=encmsgoutbufflen+1000;
01428   msgoutbuff=new UINT8[msgoutbufflen];
01429   sprintf((char*)msgoutbuff,XML_ENC_TEMPLATE,keyoutbuff,encmsgoutbuff);
01430   outlen=strlen((char*)msgoutbuff);
01431   delete[] encmsgoutbuff;
01432   encmsgoutbuff = NULL;
01433   return msgoutbuff;
01434 }
01435 
01436 #ifndef ONLY_LOCAL_PROXY
01437 SINT32 decryptXMLElement(DOMNode* node, CAASymCipher* pRSA)
01438 {
01439   XERCES_CPP_NAMESPACE::DOMDocument* doc=node->getOwnerDocument();
01440   if(! equals(node->getNodeName(),"EncryptedData"))
01441     return E_UNKNOWN;
01442   DOMNode* elemKeyInfo=NULL;
01443   getDOMChildByName(node,"ds:KeyInfo",elemKeyInfo,false);
01444   DOMNode* elemEncKey=NULL;
01445   getDOMChildByName(elemKeyInfo,"EncryptedKey",elemEncKey,false);
01446   DOMNode* elemCipherValue=NULL;
01447   getDOMChildByName(elemEncKey,"CipherValue",elemCipherValue,true);
01448   UINT8* cipherValue=new UINT8[1000];
01449   UINT32 len=1000;
01450   if(getDOMElementValue(elemCipherValue,cipherValue,&len)!=E_SUCCESS)
01451   {
01452     delete[] cipherValue;
01453     cipherValue = NULL;
01454     return E_UNKNOWN;
01455   }
01456   CABase64::decode(cipherValue,len,cipherValue,&len);
01457   if( pRSA->decryptOAEP(cipherValue,cipherValue,&len)!=E_SUCCESS||
01458       len!=32)
01459   {
01460     delete[] cipherValue;
01461     cipherValue = NULL;
01462     return E_UNKNOWN;
01463   }
01464   CASymCipher *pSymCipher=new CASymCipher();
01465   pSymCipher->setKey(cipherValue,false);
01466   pSymCipher->setIVs(cipherValue+16);
01467 
01468   DOMNode* elemCipherData=NULL;
01469   getDOMChildByName(node,"CipherData",elemCipherData,false);
01470   getDOMChildByName(elemCipherData,"CipherValue",elemCipherValue,false);
01471   len=1000;
01472   if(getDOMElementValue(elemCipherValue,cipherValue,&len)!=E_SUCCESS)
01473     {
01474       delete pSymCipher;
01475       pSymCipher = NULL;
01476       delete[] cipherValue;
01477       cipherValue = NULL;
01478       return E_UNKNOWN;
01479     }
01480   if(CABase64::decode(cipherValue,len,cipherValue,&len)!=E_SUCCESS)
01481     {
01482       delete pSymCipher;
01483       pSymCipher = NULL;
01484       delete[] cipherValue;
01485       cipherValue = NULL;
01486       return E_UNKNOWN;
01487     }
01488   SINT32 ret=pSymCipher->decrypt1CBCwithPKCS7(cipherValue,cipherValue,&len);
01489   delete pSymCipher;
01490   pSymCipher = NULL;
01491   if(ret!=E_SUCCESS)
01492     {
01493       delete[] cipherValue;
01494       cipherValue = NULL;
01495       return E_UNKNOWN;
01496     }
01497   //now the need to parse the plaintext...
01498   XERCES_CPP_NAMESPACE::DOMDocument* docPlain=parseDOMDocument(cipherValue,len);
01499   delete[] cipherValue;
01500   cipherValue = NULL;
01501   DOMNode* elemPlainRoot=NULL;
01502   if(docPlain==NULL)
01503     return E_UNKNOWN;
01504   if((elemPlainRoot=docPlain->getDocumentElement())==NULL)
01505     {
01506       if (docPlain != NULL)
01507       {
01508         docPlain->release();
01509         docPlain = NULL;
01510       }
01511       return E_UNKNOWN;
01512     }
01513   elemPlainRoot=doc->importNode(elemPlainRoot,true);
01514   DOMNode* parent=node->getParentNode();
01515   if(parent->getNodeType()==DOMNode::DOCUMENT_NODE)
01516     {
01517       DOMNode* n=parent->removeChild(node);
01518       if (n != NULL)
01519       {
01520         n->release();
01521         n = NULL;
01522       }
01523       parent->appendChild(elemPlainRoot);
01524     }
01525   else
01526     {
01527       DOMNode* n=parent->replaceChild(elemPlainRoot,node);
01528       if (n != NULL)
01529       {
01530         n->release();
01531         n = NULL;
01532       }
01533     }
01534   if (docPlain != NULL)
01535   {
01536     docPlain->release();
01537     docPlain = NULL;
01538   }
01539   return E_SUCCESS;
01540 }
01541 #endif //ONLY_LOCAL_PROXY
01542 
01543 UINT8* readFile(const UINT8* const name,UINT32* size)
01544 {
01545   int handle=open((char*)name,O_BINARY|O_RDONLY);
01546   if(handle<0)
01547     return NULL;
01548   *size=filesize32(handle);
01549   UINT8* buff=new UINT8[*size];
01550   read(handle,buff,*size);
01551   close(handle);
01552   return buff;
01553 }
01554 
01555 SINT32 saveFile(const UINT8* const name,const UINT8* const buff,UINT32 buffSize)
01556 {
01557   int handle=open((char*)name,O_BINARY|O_WRONLY|O_CREAT);
01558   if(handle<0)
01559     return E_UNKNOWN;
01560   if(write(handle,buff,buffSize)!=buffSize)
01561     {
01562       close(handle);
01563       return E_UNKNOWN;
01564   }
01565   close(handle);
01566   return E_SUCCESS;
01567 }
01568 
01573 SINT32 parseU64(const UINT8 * str, UINT64& value)
01574 {
01575   #ifdef  HAVE_STRTOULL
01576     value = strtoull((const char *) str, NULL, 0);
01577     return E_SUCCESS;
01578   #else
01579     #ifdef HAVE_NATIVE_UINT64
01580         if (str == NULL)
01581         {
01582           return E_UNKNOWN;
01583         }
01584         UINT32 len=strlen((char*)str);
01585         if (len < 1)
01586         {
01587           return E_UNKNOWN;
01588         }
01589         UINT64 u64 = 0;
01590         for (UINT32 i = 0; i < len; i++)
01591         {
01592           UINT8 c=str[i];
01593           if (c >= '0' && c <= '9')
01594           {
01595             u64 *= 10;
01596             u64 += c - '0';
01597           }
01598           else if (i != 0 || str[i] != '+')
01599           {
01600             return E_UNKNOWN;
01601           }
01602         }
01603         value = u64;
01604         return E_SUCCESS;
01605     #else
01606       #warning parseU64() is not implemented for platforms without native UINT64 support!!!
01607 
01608       return E_UNKNOWN;
01609     #endif
01610   #endif
01611 }
01612 
01617 SINT32 parseS64(const UINT8 * str, SINT64& value)
01618 {
01619   #ifdef  HAVE_ATOLL
01620     value = atoll((const char *) str);
01621     return E_SUCCESS;
01622   #else
01623     #ifdef HAVE_NATIVE_UINT64
01624         if (str == NULL)
01625         {
01626           return E_UNKNOWN;
01627         }
01628         UINT32 len=strlen((char*)str);
01629         if (len < 1)
01630         {
01631           return E_UNKNOWN;
01632         }
01633         SINT64 s64 = 0;
01634         for (UINT32 i = 0; i < len; i++)
01635         {
01636           UINT8 c=str[i];
01637           if (c >= '0' && c <= '9')
01638           {
01639             s64 *= 10;
01640             s64 += c - '0';
01641           }
01642           else if (i != 0 || str[i] != '+'||str[i]!='-')
01643           {
01644             return E_UNKNOWN;
01645           }
01646         }
01647         if(str[0]=='-')
01648           value=-s64;
01649         else
01650           value = s64;
01651         return E_SUCCESS;
01652     #else
01653       #warning parseS64() is not implemented for platforms without native INT64 support!!!
01654 
01655       return E_UNKNOWN;
01656     #endif
01657   #endif
01658 }
01659 
01660 SINT32 readPasswd(UINT8* buff,UINT32 len)
01661 {
01662   if(len==0)
01663     return E_SUCCESS;
01664 
01665 #ifndef _WIN32
01666   termios tmpTermios;
01667   UINT32 flags;
01668   bool bRestore=true;
01669   if(tcgetattr(STDIN_FILENO,&tmpTermios)!=0)
01670     {
01671       bRestore=false;
01672     }
01673   flags=tmpTermios.c_lflag;
01674   tmpTermios.c_lflag&=~(ECHO);
01675   if(bRestore)
01676     tcsetattr(STDIN_FILENO,TCSAFLUSH,&tmpTermios);
01677 #endif
01678 
01679   UINT32 i=0;
01680   for(i=0;i<len-1;i++)
01681     {
01682 #ifdef _WIN32
01683       int c=::getch();
01684 #else
01685       int c=getchar();
01686 #endif
01687       if(c<=0||c=='\r'||c=='\n')
01688         break;
01689       buff[i]=(UINT8)c;
01690     }
01691   buff[i]=0;
01692 
01693 #ifndef _WIN32
01694   tmpTermios.c_lflag=flags;
01695   if(bRestore)
01696     tcsetattr(STDIN_FILENO,TCSAFLUSH,&tmpTermios);
01697 #endif
01698   return E_SUCCESS;
01699 }
01700 
01709 /*SINT32 parseJdbcTimestamp(const UINT8 * strTimestamp, SINT32& seconds)
01710 {
01711   struct tm time;
01712   SINT32 rc;
01713 
01714   // parse the formatted string
01715   rc = sscanf((const char*)strTimestamp, "%d-%d-%d %d:%d:%d",
01716       &time.tm_year, &time.tm_mon, &time.tm_mday, &time.tm_hour,
01717       &time.tm_min, &time.tm_sec);
01718   if(rc!=6) return E_UNKNOWN; // parsing error
01719 
01720   // convert values to struct tm semantic
01721   if(time.tm_year<1970) return E_UNKNOWN;
01722   time.tm_year-=1900;
01723   if(time.tm_mon<1 || time.tm_mon>12) return E_UNKNOWN;
01724   time.tm_mon-=1;
01725   seconds = (UINT32)mktime(&time);
01726   if(seconds<0) return E_UNKNOWN;
01727 
01728   return E_SUCCESS;
01729 }*/
01730 
01731 
01740 /*SINT32 formatJdbcTimestamp(const SINT32 seconds, UINT8 * strTimestamp, const UINT32 len)
01741 {
01742   struct tm * time;
01743   time = localtime((time_t *) (&seconds));
01744   // without this line, there are problems on 64 BIT machines!!
01745   CAMsg::printMsg( LOG_DEBUG, "Year: %d Month: %d\n", time->tm_year, time->tm_mon);
01746 
01747   if(strftime((char *)strTimestamp, len, "%Y-%m-%d %H:%M:%S", time) == 0)
01748   {
01749     return E_SPACE;
01750   }
01751   return E_SUCCESS;
01752 }*/