int CDbxKyoto::InitCrypt() { CRYPTO_PROVIDER *pProvider; bool bMissingKey = false; DBVARIANT dbv = { 0 }; dbv.type = DBVT_BLOB; if (GetContactSetting(NULL, "CryptoEngine", "Provider", &dbv)) { LBL_CreateProvider: CRYPTO_PROVIDER **ppProvs; int iNumProvs; Crypto_EnumProviders(&iNumProvs, &ppProvs); if (iNumProvs == 0) return 1; pProvider = ppProvs[0]; //!!!!!!!!!!!!!!!!!! DBCONTACTWRITESETTING dbcws = { "CryptoEngine", "Provider" }; dbcws.value.type = DBVT_BLOB; dbcws.value.pbVal = (PBYTE)pProvider->pszName; dbcws.value.cpbVal = (int)strlen(pProvider->pszName) + 1; WriteContactSetting(NULL, &dbcws); } else { if (dbv.type != DBVT_BLOB) { // old version, clean it up bMissingKey = true; goto LBL_CreateProvider; } pProvider = Crypto_GetProvider(LPCSTR(dbv.pbVal)); FreeVariant(&dbv); if (pProvider == NULL) goto LBL_CreateProvider; } if ((m_crypto = pProvider->pFactory()) == NULL) return 3; dbv.type = DBVT_BLOB; if (GetContactSetting(NULL, "CryptoEngine", "StoredKey", &dbv)) { bMissingKey = true; LBL_SetNewKey: m_crypto->generateKey(); // unencrypted key StoreKey(); } else { size_t iKeyLength = m_crypto->getKeyLength(); if (dbv.cpbVal != (WORD)iKeyLength) goto LBL_SetNewKey; if (!m_crypto->setKey(dbv.pbVal, iKeyLength)) if (!EnterPassword(dbv.pbVal, iKeyLength)) // password protected? return 4; FreeVariant(&dbv); } if (bMissingKey) EnumModuleNames(sttModuleEnum, this); dbv.type = DBVT_BYTE; if (!GetContactSetting(NULL, "CryptoEngine", "DatabaseEncryption", &dbv)) m_bEncrypted = dbv.bVal != 0; InitDialogs(); return 0; }
STDMETHODIMP_(BOOL) CDataBase::GetContactSettingStr(HANDLE hContact, DBCONTACTGETSETTING *dbcgs) { if ((dbcgs->pValue->type & DBVTF_VARIABLELENGTH) == 0) { FreeVariant(dbcgs->pValue); dbcgs->pValue->type = 0; } char namebuf[512]; namebuf[0] = 0; if (dbcgs->szModule) strcpy_s(namebuf, dbcgs->szModule); strcat_s(namebuf, "/"); if (dbcgs->szSetting) strcat_s(namebuf, dbcgs->szSetting); TDBTSettingDescriptor desc = {0,0,0,0,0,0,0,0}; TDBTSetting set = {0,0,0,0}; desc.cbSize = sizeof(desc); desc.Entity = (WPARAM)hContact; desc.pszSettingName = namebuf; set.cbSize = sizeof(set); set.Descriptor = &desc; switch (dbcgs->pValue->type) { case DBVT_ASCIIZ: set.Type = DBT_ST_ANSI; break; case DBVT_BLOB: set.Type = DBT_ST_BLOB; break; case DBVT_UTF8: set.Type = DBT_ST_UTF8; break; case DBVT_WCHAR: set.Type = DBT_ST_WCHAR; break; } if (DBSettingRead(reinterpret_cast<WPARAM>(&set), 0) == DBT_INVALIDPARAM) return -1; switch (set.Type) { case DBT_ST_ANSI: dbcgs->pValue->type = DBVT_ASCIIZ; dbcgs->pValue->pszVal = set.Value.pAnsi; dbcgs->pValue->cchVal = set.Value.Length - 1; if (isEncrypted(dbcgs->szModule, dbcgs->szSetting)) DecodeString(dbcgs->pValue->pszVal); break; case DBT_ST_UTF8: dbcgs->pValue->type = DBVT_UTF8; dbcgs->pValue->pszVal = set.Value.pUTF8; dbcgs->pValue->cchVal = set.Value.Length - 1; if (isEncrypted(dbcgs->szModule, dbcgs->szSetting)) DecodeString(dbcgs->pValue->pszVal); break; case DBT_ST_WCHAR: if (dbcgs->pValue->type == DBVT_WCHAR) { dbcgs->pValue->pwszVal = set.Value.pWide; dbcgs->pValue->cchVal = set.Value.Length - 1; } else { dbcgs->pValue->type = DBVT_UTF8; dbcgs->pValue->pszVal = mir_utf8encodeW(set.Value.pWide); dbcgs->pValue->cchVal = static_cast<uint32_t>(strlen(dbcgs->pValue->pszVal)); if (isEncrypted(dbcgs->szModule, dbcgs->szSetting)) DecodeString(dbcgs->pValue->pszVal); mir_free(set.Value.pWide); } break; case DBT_ST_BLOB: dbcgs->pValue->type = DBVT_BLOB; dbcgs->pValue->pbVal = set.Value.pBlob; dbcgs->pValue->cpbVal = set.Value.Length; break; case DBT_ST_BOOL: dbcgs->pValue->type = DBVT_BYTE; dbcgs->pValue->bVal = (uint8_t)set.Value.Bool; break; case DBT_ST_BYTE: case DBT_ST_CHAR: dbcgs->pValue->type = DBVT_BYTE; dbcgs->pValue->bVal = set.Value.Byte; break; case DBT_ST_SHORT: case DBT_ST_WORD: dbcgs->pValue->type = DBVT_WORD; dbcgs->pValue->wVal = set.Value.Word; break; case DBT_ST_INT: case DBT_ST_DWORD: dbcgs->pValue->type = DBVT_DWORD; dbcgs->pValue->dVal = set.Value.DWord; break; case DBT_ST_INT64: case DBT_ST_QWORD: case DBT_ST_DOUBLE: case DBT_ST_FLOAT: dbcgs->pValue->type = DBVT_BLOB; dbcgs->pValue->cpbVal = sizeof(set.Value); dbcgs->pValue->pbVal = reinterpret_cast<BYTE*>(mir_alloc(sizeof(set.Value))); memcpy(dbcgs->pValue->pbVal, &set.Value, sizeof(set.Value)); break; default: return -1; } return 0; }
int CDb3Mmap::InitCrypt() { if (m_dbHeader.version == DB_OLD_VERSION) return 0; CRYPTO_PROVIDER *pProvider; bool bMissingKey = false; DBVARIANT dbv = { 0 }; dbv.type = DBVT_BLOB; if (GetContactSetting(NULL, "CryptoEngine", "Provider", &dbv)) { LBL_CreateProvider: CRYPTO_PROVIDER **ppProvs; int iNumProvs; Crypto_EnumProviders(&iNumProvs, &ppProvs); if (iNumProvs == 0) return 1; if (iNumProvs > 1) { CSelectCryptoDialog dlg(ppProvs, iNumProvs); dlg.DoModal(); pProvider = dlg.GetSelected(); } else pProvider = ppProvs[0]; DBCONTACTWRITESETTING dbcws = { "CryptoEngine", "Provider" }; dbcws.value.type = DBVT_BLOB; dbcws.value.pbVal = (PBYTE)pProvider->pszName; dbcws.value.cpbVal = (int)mir_strlen(pProvider->pszName) + 1; WriteContactSetting(NULL, &dbcws); } else { if (dbv.type != DBVT_BLOB) { // old version, clean it up bMissingKey = true; goto LBL_CreateProvider; } pProvider = Crypto_GetProvider(LPCSTR(dbv.pbVal)); FreeVariant(&dbv); if (pProvider == NULL) goto LBL_CreateProvider; } if ((m_crypto = pProvider->pFactory()) == NULL) return 3; dbv.type = DBVT_BLOB; if (GetContactSetting(NULL, "CryptoEngine", "StoredKey", &dbv)) { bMissingKey = true; LBL_SetNewKey: m_crypto->generateKey(); // unencrypted key StoreKey(); } else { size_t iKeyLength = m_crypto->getKeyLength(); if (dbv.cpbVal != (WORD)iKeyLength) goto LBL_SetNewKey; if (!m_crypto->setKey(dbv.pbVal, iKeyLength)) { if (memcmp(m_dbHeader.signature, &dbSignatureE, sizeof(m_dbHeader.signature))) goto LBL_SetNewKey; if (!EnterPassword(dbv.pbVal, iKeyLength)) { // password protected? if (m_dbHeader.version >= DB_094_VERSION) return 4; // one of the early used version of mmap was replaced then by mmap_sa // simply remove old badly generated key bMissingKey = true; goto LBL_SetNewKey; } } FreeVariant(&dbv); } if (bMissingKey) EnumModuleNames(sttModuleEnum, this); dbv.type = DBVT_BYTE; if (!GetContactSetting(NULL, "CryptoEngine", "DatabaseEncryption", &dbv)) m_bEncrypted = dbv.bVal != 0; InitDialogs(); return 0; }