예제 #1
0
int __cdecl rsa_check_pub(HANDLE context, PBYTE pub, int pubLen, PBYTE sig, int sigLen) {
    int v=0, k=0;
    pUinKey ptr = getUinCtx(context);
    if(!ptr) return 0;
    LPSTR cnm = (LPSTR) mir_alloc(NAMSIZE);
    getContactNameA(ptr->hContact,cnm);
    LPSTR uin = (LPSTR) mir_alloc(KEYSIZE);
    getContactUinA(ptr->hContact,uin);
    LPSTR msg = (LPSTR) mir_alloc(MSGSIZE);
    LPSTR sha = mir_strdup(to_hex(sig,sigLen));
    LPSTR sha_old = NULL;
#if defined(_DEBUG) || defined(NETLIB_LOG)
    Sent_NetLog("rsa_check_pub: %s %s %s", cnm, uin, sha);
#endif
    DBVARIANT dbv;
    dbv.type = DBVT_BLOB;
    if( DBGetContactSetting(ptr->hContact,szModuleName,"rsa_pub",&dbv) == 0 ) {
        k = 1;
        PBYTE buf = (PBYTE) alloca(sigLen);
        int len;
        exp->rsa_get_hash((PBYTE)dbv.pbVal,dbv.cpbVal,(PBYTE)buf,&len);
        sha_old = mir_strdup(to_hex(buf,len));
        DBFreeVariant(&dbv);
    }
    if( bAAK ) {
        if( k )	mir_snprintf(msg,MSGSIZE,Translate(sim523),cnm,uin,sha,sha_old);
        else	mir_snprintf(msg,MSGSIZE,Translate(sim521),cnm,uin,sha);
        showPopUpKRmsg(ptr->hContact,msg);
        HistoryLog(ptr->hContact,msg);
        v = 1;
#if defined(_DEBUG) || defined(NETLIB_LOG)
        Sent_NetLog("rsa_check_pub: auto accepted");
#endif
    }
    else {
        if( k ) mir_snprintf(msg,MSGSIZE,Translate(sim522),cnm,sha,sha_old);
        else	mir_snprintf(msg,MSGSIZE,Translate(sim520),cnm,sha);
        v = (msgbox(0,msg,szModuleName,MB_YESNO|MB_ICONQUESTION)==IDYES);
#if defined(_DEBUG) || defined(NETLIB_LOG)
        Sent_NetLog("rsa_check_pub: manual accepted %d",v);
#endif
    }
    if(v) {
        DBCONTACTWRITESETTING cws;
        cws.szModule = szModuleName;
        cws.szSetting = "rsa_pub";
        cws.value.type = DBVT_BLOB;
        cws.value.pbVal = pub;
        cws.value.cpbVal = pubLen;
        CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)ptr->hContact, (LPARAM)&cws);
        ptr->keyLoaded = true;
    }
    mir_free(cnm);
    mir_free(uin);
    mir_free(msg);
    mir_free(sha);
    SAFE_FREE(sha_old);
    return v;
}
예제 #2
0
int __cdecl rsa_check_pub(HANDLE context, PBYTE pub, int pubLen, PBYTE sig, int sigLen)
{
	int v = 0, k = 0;
	pUinKey ptr = getUinCtx(context); if (!ptr) return 0;
	LPSTR cnm = (LPSTR)mir_alloc(NAMSIZE); getContactNameA(ptr->hContact, cnm);
	LPSTR uin = (LPSTR)mir_alloc(KEYSIZE); getContactUinA(ptr->hContact, uin);
	LPSTR msg = (LPSTR)mir_alloc(MSGSIZE);
	LPSTR sha = mir_strdup(to_hex(sig, sigLen));
	LPSTR sha_old = NULL;

	Sent_NetLog("rsa_check_pub: %s %s %s", cnm, uin, sha);

	DBVARIANT dbv;
	dbv.type = DBVT_BLOB;
	if (db_get(ptr->hContact, MODULENAME, "rsa_pub", &dbv) == 0) {
		k = 1;
		PBYTE buf = (PBYTE)alloca(sigLen); int len;
		mir_exp->rsa_get_hash((PBYTE)dbv.pbVal, dbv.cpbVal, (PBYTE)buf, &len);
		sha_old = mir_strdup(to_hex(buf, len));
		db_free(&dbv);
	}
	if (bAAK) {
		if (k)	mir_snprintf(msg, MSGSIZE, Translate(sim523), cnm, uin, sha, sha_old);
		else	mir_snprintf(msg, MSGSIZE, Translate(sim521), cnm, uin, sha);
		showPopupKRmsg(ptr->hContact, msg);
		HistoryLog(ptr->hContact, msg);
		v = 1;
#if defined(_DEBUG) || defined(NETLIB_LOG)
		Sent_NetLog("rsa_check_pub: auto accepted");
#endif
	}
	else {
		if (k) mir_snprintf(msg, MSGSIZE, Translate(sim522), cnm, sha, sha_old);
		else	mir_snprintf(msg, MSGSIZE, Translate(sim520), cnm, sha);
		v = (msgbox(0, msg, MODULENAME, MB_YESNO | MB_ICONQUESTION) == IDYES);
#if defined(_DEBUG) || defined(NETLIB_LOG)
		Sent_NetLog("rsa_check_pub: manual accepted %d", v);
#endif
	}
	if (v) {
		db_set_blob(ptr->hContact, MODULENAME, "rsa_pub", pub, pubLen);
		ptr->keyLoaded = true;
	}
	mir_free(cnm);
	mir_free(uin);
	mir_free(msg);
	mir_free(sha);
	SAFE_FREE(sha_old);
	return v;
}
예제 #3
0
int __cdecl rsa_inject(HANDLE context, LPCSTR msg) {
	pUinKey ptr = getUinCtx(context); if(!ptr) return 0;
#if defined(_DEBUG) || defined(NETLIB_LOG)
	Sent_NetLog("rsa_inject: '%s'", msg);
#endif
	int len = strlen(msg)+1;
	LPSTR buf = (LPSTR) mir_alloc(LEN_SECU+len);
	memcpy(buf,SIG_SECU,LEN_SECU);
	memcpy(buf+LEN_SECU,msg,len);
	// отправляем сообщение
	splitMessageSend(ptr,buf);
	mir_free(buf);
	return 1;
}
예제 #4
0
void __cdecl rsa_notify(HANDLE context, int state)
{
	pUinKey ptr = getUinCtx(context); if (!ptr) return;
	LPCSTR msg = NULL;

	Sent_NetLog("rsa_notify: 0x%x", state);

	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; 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];
		mir_snprintf(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); // досылаем нешифровано
}
예제 #5
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); // досылаем нешифровано
}