// 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;
}
Exemple #2
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); // досылаем нешифровано
}