From cb4a46e7fbe62d788e66ed6121c717a2d22a4d7c Mon Sep 17 00:00:00 2001 From: watcherhd Date: Thu, 21 Apr 2011 14:14:52 +0000 Subject: svn.miranda.im is moving to a new home! git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@7 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- cryptopp/cpp_cntx.cpp | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 cryptopp/cpp_cntx.cpp (limited to 'cryptopp/cpp_cntx.cpp') diff --git a/cryptopp/cpp_cntx.cpp b/cryptopp/cpp_cntx.cpp new file mode 100644 index 0000000..eba8837 --- /dev/null +++ b/cryptopp/cpp_cntx.cpp @@ -0,0 +1,184 @@ +#include "commonheaders.h" + + +list CL; // CL.size() CL.empty() + +HANDLE thread_timeout = 0; + +unsigned __stdcall sttTimeoutThread(LPVOID); + + +// get context data on context id +pCNTX get_context_on_id(HANDLE context) { + + if( !thread_timeout ) { + unsigned int tID; + thread_timeout = (HANDLE) _beginthreadex(NULL, 0, sttTimeoutThread, NULL, 0, &tID); + } + + if( context ) { + pCNTX cntx = (pCNTX) context; + if( cntx->header == HEADER && cntx->footer == FOOTER ) + return cntx; +#if defined(_DEBUG) || defined(NETLIB_LOG) + else + Sent_NetLog("get_context_on_id: corrupted context %08X", cntx); +#endif + } + return NULL; +} + +/* +pCNTX get_context_on_id(HANDLE context) { + return get_context_on_id((int)context); +} +*/ + +// create context, return context id +HANDLE __cdecl cpp_create_context(int mode) { + + list::iterator i; + pCNTX cntx = NULL; + + EnterCriticalSection(&localContextMutex); + + if( !CL.empty() ) { + for(i=CL.begin(); i!=CL.end(); ++i) { // ищем пустой + if( (*i)->header==EMPTYH && (*i)->footer==EMPTYH ) { + cntx = (pCNTX) *i; + break; + } + } + } + + if( !cntx ) { // не нашли - создаем новый + cntx = (pCNTX) malloc(sizeof(CNTX)); + CL.push_back(cntx); // добавили в конец списка + } + + memset(cntx,0,sizeof(CNTX)); // очищаем выделенный блок + cntx->header = HEADER; + cntx->footer = FOOTER; + cntx->mode = mode; + + LeaveCriticalSection(&localContextMutex); + + return (HANDLE)cntx; +} + + +// delete context +void __cdecl cpp_delete_context(HANDLE context) { + + pCNTX tmp = get_context_on_id(context); + if(tmp) { // помечаем на удаление + tmp->deleted = gettime()+10; // будет удален через 10 секунд + } +} + + +// reset context +void __cdecl cpp_reset_context(HANDLE context) { + + pCNTX tmp = get_context_on_id(context); + if(tmp) cpp_free_keys(tmp); +} + + +// allocate pdata +PBYTE cpp_alloc_pdata(pCNTX ptr) { + if( !ptr->pdata ) { + if( ptr->mode & MODE_PGP ) { + ptr->pdata = (PBYTE) malloc(sizeof(PGPDATA)); + memset(ptr->pdata,0,sizeof(PGPDATA)); + } + else + if( ptr->mode & MODE_GPG ) { + ptr->pdata = (PBYTE) malloc(sizeof(GPGDATA)); + memset(ptr->pdata,0,sizeof(GPGDATA)); + } + else + if( ptr->mode & MODE_RSA ) { + rsa_alloc(ptr); + } + else { + ptr->pdata = (PBYTE) malloc(sizeof(SIMDATA)); + memset(ptr->pdata,0,sizeof(SIMDATA)); + } + } + return ptr->pdata; +} + + +// free memory from keys +void cpp_free_keys(pCNTX ptr) { + + SAFE_FREE(ptr->tmp); + cpp_alloc_pdata(ptr); + if( ptr->mode & MODE_PGP ) { + pPGPDATA p = (pPGPDATA) ptr->pdata; + SAFE_FREE(p->pgpKeyID); + SAFE_FREE(p->pgpKey); + SAFE_FREE(ptr->pdata); + } + else + if( ptr->mode & MODE_GPG ) { + pGPGDATA p = (pGPGDATA) ptr->pdata; + SAFE_FREE(p->gpgKeyID); + SAFE_FREE(ptr->pdata); + } + else + if( ptr->mode & MODE_RSA ) { + rsa_free(ptr); + SAFE_DELETE(ptr->pdata); + } + else { + pSIMDATA p = (pSIMDATA) ptr->pdata; + SAFE_FREE(p->PubA); + SAFE_FREE(p->KeyA); + SAFE_FREE(p->KeyB); + SAFE_FREE(p->KeyX); + SAFE_FREE(p->KeyP); + SAFE_DELETE(p->dh); + SAFE_FREE(ptr->pdata); + } +} + + +// search not established RSA/AES contexts && clear deleted contexts +unsigned __stdcall sttTimeoutThread( LPVOID ) { + + list::iterator i; + while(1) { + Sleep( 1000 ); // раз в секунду + if( CL.empty() ) continue; + u_int time = gettime(); + // пробегаем все контексты + EnterCriticalSection(&localContextMutex); + for(i=CL.begin(); i!=CL.end(); ++i) { + pCNTX tmp = *i; + if( tmp->header!=HEADER || tmp->footer!=FOOTER ) continue; + // пропускаем приватные ключи + if( tmp->mode&MODE_PRIV_KEY ) continue; + else + if( tmp->deleted && tmp->deleted < time ) { + // удалить помеченный для удаления контекст + cpp_free_keys(tmp); + tmp->deleted = 0; + tmp->header = tmp->footer = EMPTYH; + } + else + if( tmp->mode&MODE_RSA && tmp->pdata ) { + // проверяем не протухло ли соединение + pRSADATA p = (pRSADATA) tmp->pdata; + if( p->time && p->time < time ) { + rsa_timeout((HANDLE)tmp,p); + } + } + } // for + LeaveCriticalSection(&localContextMutex); + } //while +} + + +// EOF -- cgit v1.2.3