|
Mixe for Privacy and Anonymity in the Internet
|
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 }*/
1.7.6.1