// calculate secret key BOOL CalculateKeyX(pUinKey ptr,HANDLE hContact) { int agr = cpp_calc_keyx(ptr->cntx); if( agr ) { // do this only if key exchanged is ok // we use a 192bit key int keysize = cpp_size_keyx(); PBYTE buffer = (PBYTE) alloca(keysize); // buffer for hash // store key cpp_get_keyx(ptr->cntx,buffer); DBCONTACTWRITESETTING cws; cws.szModule = szModuleName; // store key in database cws.szSetting = "offlineKey"; cws.value.type = DBVT_BLOB; cws.value.cpbVal = keysize; cws.value.pbVal = buffer; CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)hContact, (LPARAM)&cws); // store timeout of key in database (2 days) cws.szSetting = "offlineKeyTimeout"; cws.value.type = DBVT_DWORD; cws.value.dVal = gettime()+(60*60*24*DBGetContactSettingWord(0,szModuleName,"okt",2)); CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)hContact, (LPARAM)&cws); // key exchange is finished showPopUpEC(ptr->hContact); } else { // agree value problem showPopUp(sim002,hContact,g_hPOP[POP_PU_DIS],0); } return agr!=0; }
void __cdecl rsa_notify(HANDLE context, int state) { pUinKey ptr = getUinCtx(context); if(!ptr) return; LPCSTR msg=NULL; #if defined(_DEBUG) || defined(NETLIB_LOG) Sent_NetLog("rsa_notify: 0x%x", state); #endif switch( state ) { case 1: { showPopUpEC(ptr->hContact); ShowStatusIconNotify(ptr->hContact); waitForExchange(ptr,2); // досылаем сообщения из очереди return; } case -1: // сессия разорвана по ошибке, неверный тип сообщения msg=sim501; break; case -2: // сессия разорвана по ошибке другой стороной msg=sim502; break; case -5: // ошибка декодирования AES сообщения msg=sim505; break; case -6: // ошибка декодирования RSA сообщения msg=sim506; break; case -7: // таймаут установки соединения (10 секунд) msg=sim507; break; case -8: { // сессия разорвана по причине "disabled" msg=sim508; // ptr->status=ptr->tstatus=STATUS_DISABLED; // DBWriteContactSettingByte(ptr->hContact, szModuleName, "StatusID", ptr->status); } break; case -0x10: // сессия разорвана по ошибке case -0x21: case -0x22: case -0x23: case -0x24: case -0x32: case -0x33: case -0x34: case -0x40: case -0x50: case -0x60: { char buf[1024]; sprintf(buf,sim510,-state); showPopUpDCmsg(ptr->hContact,buf); ShowStatusIconNotify(ptr->hContact); if(ptr->cntx) deleteRSAcntx(ptr); waitForExchange(ptr,3); // досылаем нешифровано return; } case -3: // соединение разорвано вручную case -4: { // соединение разорвано вручную другой стороной showPopUpDC(ptr->hContact); ShowStatusIconNotify(ptr->hContact); if(ptr->cntx) deleteRSAcntx(ptr); waitForExchange(ptr,3); // досылаем нешифровано return; } default: return; } showPopUpDCmsg(ptr->hContact,msg); ShowStatusIconNotify(ptr->hContact); if(ptr->cntx) deleteRSAcntx(ptr); waitForExchange(ptr,3); // досылаем нешифровано }