From 683ca5965e69d1780d957ab6f59b704c612852fa Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Tue, 8 Apr 2014 17:54:46 +0000 Subject: Steam: - added options - removed OpenSSL dependencies - cleaned project files git-svn-id: http://svn.miranda-ng.org/main/trunk@8893 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Steam/src/steam_account.cpp | 264 +++++++++++++--------------------- 1 file changed, 100 insertions(+), 164 deletions(-) (limited to 'protocols/Steam/src/steam_account.cpp') diff --git a/protocols/Steam/src/steam_account.cpp b/protocols/Steam/src/steam_account.cpp index 61469a02a1..133ddd068c 100644 --- a/protocols/Steam/src/steam_account.cpp +++ b/protocols/Steam/src/steam_account.cpp @@ -90,186 +90,118 @@ void CSteamProto::Authorize(SteamWebApi::AuthorizationApi::AuthResult *authResul ptrW username(getWStringA("Username")); ptrA base64RsaEncryptedPassword; - DBVARIANT dbv; - CMStringA timestamp; - DWORD encryptedSize = 0; - BYTE *encryptedPassword = NULL; - db_get(NULL, this->m_szModuleName, "EncryptedPassword", &dbv); - if (dbv.type == DBVT_BLOB && dbv.pbVal && dbv.cpbVal > 0) - { - encryptedSize = dbv.cpbVal; - encryptedPassword = (BYTE*)mir_alloc(dbv.cpbVal); - memcpy(encryptedPassword, dbv.pbVal, dbv.cpbVal); - - timestamp = getStringA("RsaTimestamp"); - } - else - { - // get rsa public key - SteamWebApi::RsaKeyApi::RsaKey rsaKey; - SteamWebApi::RsaKeyApi::GetRsaKey(m_hNetlibUser, username, &rsaKey); - if (!rsaKey.IsSuccess()) - { - db_free(&dbv); - return; - } - - timestamp = rsaKey.GetTimestamp(); - setString("RsaTimestamp", timestamp); - - ptrA password(getStringA("Password")); - - // OpenSSL rsa is depricated - /*BIGNUM *n = BN_new(); - if (!BN_hex2bn(&n, rsaKey.GetModulus())) - { - BN_free(n); - return; - } - - BIGNUM *e = BN_new(); - if (!BN_hex2bn(&e, rsaKey.GetExponent())) - { - BN_free(e); - return; - } - - RSA *rsa = RSA_new(); - rsa->n = n; - rsa->e = e; - - encryptedSize = RSA_size(rsa); - encryptedPassword = (BYTE*)mir_alloc(encryptedSize); - if (RSA_public_encrypt(strlen(password), (unsigned char*)(char*)password, encryptedPassword, rsa, RSA_PKCS1_PADDING) < 0) - { - RSA_free(rsa); - return; - } + // get rsa public key + SteamWebApi::RsaKeyApi::RsaKey rsaKey; + SteamWebApi::RsaKeyApi::GetRsaKey(m_hNetlibUser, username, &rsaKey); + if (!rsaKey.IsSuccess()) + return; - BN_free(e); - BN_free(n); - RSA_free(rsa);*/ + ptrA password(getStringA("Password")); - const char *pszModulus = rsaKey.GetModulus(); - DWORD cchModulus = strlen(pszModulus); + const char *pszModulus = rsaKey.GetModulus(); + DWORD cchModulus = strlen(pszModulus); - // convert hex string to byte array - DWORD cbLen = 0, dwSkip = 0, dwFlags = 0; - if (!CryptStringToBinaryA(pszModulus, cchModulus, CRYPT_STRING_HEX, NULL, &cbLen, &dwSkip, &dwFlags)) - { - DWORD dwResult = GetLastError(); - int i = 0; - } + // convert hex string to byte array + DWORD cbLen = 0, dwSkip = 0, dwFlags = 0; + if (!CryptStringToBinaryA(pszModulus, cchModulus, CRYPT_STRING_HEX, NULL, &cbLen, &dwSkip, &dwFlags)) + { + debugLogA("CSteamProto::Authorize: Cannot get size of rsa modulus in binary (%lu)", GetLastError()); + return; + } - // Allocate a new buffer. - BYTE *pbBuffer = (BYTE*)malloc(cbLen); - if (!CryptStringToBinaryA(pszModulus, cchModulus, CRYPT_STRING_HEX, pbBuffer, &cbLen, &dwSkip, &dwFlags)) - { - DWORD dwResult = GetLastError(); - int i = 0; - } + // Allocate a new buffer. + BYTE *pbBuffer = (BYTE*)malloc(cbLen); + if (!CryptStringToBinaryA(pszModulus, cchModulus, CRYPT_STRING_HEX, pbBuffer, &cbLen, &dwSkip, &dwFlags)) + { + debugLogA("CSteamProto::Authorize: Cannot convert rsa modulus to binary (%lu)", GetLastError()); + return; + } - // reverse byte array, because of microsoft - for (int i = 0; i < cbLen / 2; ++i) - { - BYTE temp = pbBuffer[cbLen - i - 1]; - pbBuffer[cbLen - i - 1] = pbBuffer[i]; - pbBuffer[i] = temp; - } + // reverse byte array, because of microsoft + for (int i = 0; i < cbLen / 2; ++i) + { + BYTE temp = pbBuffer[cbLen - i - 1]; + pbBuffer[cbLen - i - 1] = pbBuffer[i]; + pbBuffer[i] = temp; + } - HCRYPTPROV hCSP = 0; - if (!CryptAcquireContext(&hCSP, NULL, NULL, PROV_RSA_AES, CRYPT_SILENT) || - !CryptAcquireContext(&hCSP, NULL, NULL, PROV_RSA_AES, CRYPT_SILENT | CRYPT_NEWKEYSET)) - { - DWORD dwResult = GetLastError(); - int i = 0; - } + HCRYPTPROV hCSP = 0; + if (!CryptAcquireContext(&hCSP, NULL, NULL, PROV_RSA_AES, CRYPT_SILENT) && + !CryptAcquireContext(&hCSP, NULL, NULL, PROV_RSA_AES, CRYPT_SILENT | CRYPT_NEWKEYSET)) + { + debugLogA("CSteamProto::Authorize: Cannot create rsa context (%lu)", GetLastError()); + return; + } - // Move the key into the key container. - DWORD cbKeyBlob = sizeof(PUBLICKEYSTRUC) + sizeof(RSAPUBKEY) + cbLen; - BYTE *pKeyBlob = (BYTE*)malloc(cbKeyBlob); - - // Fill in the data. - PUBLICKEYSTRUC *pPublicKey = (PUBLICKEYSTRUC*)pKeyBlob; - pPublicKey->bType = PUBLICKEYBLOB; - pPublicKey->bVersion = CUR_BLOB_VERSION; // Always use this value. - pPublicKey->reserved = 0; // Must be zero. - pPublicKey->aiKeyAlg = CALG_RSA_KEYX; // RSA public-key key exchange. - - // The next block of data is the RSAPUBKEY structure. - RSAPUBKEY *pRsaPubKey = (RSAPUBKEY*)(pKeyBlob + sizeof(PUBLICKEYSTRUC)); - pRsaPubKey->magic = 0x31415352; // RSA1 // Use public key - pRsaPubKey->bitlen = cbLen * 8; // Number of bits in the modulus. - pRsaPubKey->pubexp = 0x10001; // "010001" // Exponent. - - // Copy the modulus into the blob. Put the modulus directly after the - // RSAPUBKEY structure in the blob. - BYTE *pKey = (BYTE*)(((BYTE *)pRsaPubKey) + sizeof(RSAPUBKEY)); - //pKeyBlob + sizeof(BLOBHEADER)+ sizeof(RSAPUBKEY); - memcpy(pKey, pbBuffer, cbLen); - - // Now import public key - HCRYPTKEY phKey = 0; - if (!CryptImportKey(hCSP, pKeyBlob, cbKeyBlob, 0, 0, &phKey)) - { - DWORD err = GetLastError(); - int i = 0; - } + // Move the key into the key container. + DWORD cbKeyBlob = sizeof(PUBLICKEYSTRUC) + sizeof(RSAPUBKEY) + cbLen; + BYTE *pKeyBlob = (BYTE*)malloc(cbKeyBlob); + + // Fill in the data. + PUBLICKEYSTRUC *pPublicKey = (PUBLICKEYSTRUC*)pKeyBlob; + pPublicKey->bType = PUBLICKEYBLOB; + pPublicKey->bVersion = CUR_BLOB_VERSION; // Always use this value. + pPublicKey->reserved = 0; // Must be zero. + pPublicKey->aiKeyAlg = CALG_RSA_KEYX; // RSA public-key key exchange. + + // The next block of data is the RSAPUBKEY structure. + RSAPUBKEY *pRsaPubKey = (RSAPUBKEY*)(pKeyBlob + sizeof(PUBLICKEYSTRUC)); + pRsaPubKey->magic = 0x31415352; // RSA1 // Use public key + pRsaPubKey->bitlen = cbLen * 8; // Number of bits in the modulus. + pRsaPubKey->pubexp = 0x10001; // "010001" // Exponent. + + // Copy the modulus into the blob. Put the modulus directly after the + // RSAPUBKEY structure in the blob. + BYTE *pKey = (BYTE*)(((BYTE *)pRsaPubKey) + sizeof(RSAPUBKEY)); + //pKeyBlob + sizeof(BLOBHEADER)+ sizeof(RSAPUBKEY); + memcpy(pKey, pbBuffer, cbLen); + + // Now import public key + HCRYPTKEY phKey = 0; + if (!CryptImportKey(hCSP, pKeyBlob, cbKeyBlob, 0, 0, &phKey)) + { + debugLogA("CSteamProto::Authorize: Cannot import rsa key to context (%lu)", GetLastError()); + return; + } - // encrypt password - DWORD pwdLength = strlen(password); - if (!CryptEncrypt(phKey, 0, TRUE, 0, NULL, &encryptedSize, pwdLength)) - { - DWORD err = GetLastError(); - int i = 0; - } + // encrypt password + DWORD encryptedSize = 0; + DWORD pwdLength = strlen(password); + if (!CryptEncrypt(phKey, 0, TRUE, 0, NULL, &encryptedSize, pwdLength)) + { + debugLogA("CSteamProto::Authorize: Cannot get rsa encrypt length (%lu)", GetLastError()); + return; + } - encryptedPassword = (BYTE*)mir_calloc(encryptedSize); - memcpy(encryptedPassword, password, pwdLength); - if (!CryptEncrypt(phKey, 0, TRUE, 0, encryptedPassword, &pwdLength, encryptedSize)) - { - DWORD err = GetLastError(); - int i = 0; - } + BYTE *encryptedPassword = (BYTE*)mir_calloc(encryptedSize); + memcpy(encryptedPassword, password, pwdLength); + if (!CryptEncrypt(phKey, 0, TRUE, 0, encryptedPassword, &pwdLength, encryptedSize)) + { + debugLogA("CSteamProto::Authorize: Cannot rsa encrypt password (%lu)", GetLastError()); + return; + } - // reverse byte array again - for (int i = 0; i < encryptedSize / 2; ++i) - { - BYTE temp = encryptedPassword[encryptedSize - i - 1]; - encryptedPassword[encryptedSize - i - 1] = encryptedPassword[i]; - encryptedPassword[i] = temp; - } + // reverse byte array again + for (int i = 0; i < encryptedSize / 2; ++i) + { + BYTE temp = encryptedPassword[encryptedSize - i - 1]; + encryptedPassword[encryptedSize - i - 1] = encryptedPassword[i]; + encryptedPassword[i] = temp; + } - // save rsa encrypted password to db - db_set_blob(NULL, this->m_szModuleName, "EncryptedPassword", encryptedPassword, encryptedSize); + // save rsa encrypted password to db + db_set_blob(NULL, this->m_szModuleName, "EncryptedPassword", encryptedPassword, encryptedSize); - CryptDestroyKey(phKey); - free(pKeyBlob); - CryptReleaseContext(hCSP, 0); - free(pbBuffer); - } - db_free(&dbv); - - //DWORD cbLen = 0, dwSkip = 0, dwFlags = 0; - //if (!CryptBinaryToStringA(encryptedPassword, encryptedSize, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NULL, &cbLen)) - //{ - // DWORD dwResult = GetLastError(); - // int i = 0; - //} - - //// Allocate a new buffer. - //char *pbBuffer = (char*)malloc(cbLen); - //if (!CryptBinaryToStringA(encryptedPassword, encryptedSize, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, pbBuffer, &cbLen)) - //{ - // DWORD dwResult = GetLastError(); - // int i = 0; - //} + CryptDestroyKey(phKey); + free(pKeyBlob); + CryptReleaseContext(hCSP, 0); + free(pbBuffer); base64RsaEncryptedPassword = mir_base64_encode(encryptedPassword, encryptedSize); mir_free(encryptedPassword); // try to authorize - SteamWebApi::AuthorizationApi::Authorize(m_hNetlibUser, username, base64RsaEncryptedPassword, timestamp, authResult); + SteamWebApi::AuthorizationApi::Authorize(m_hNetlibUser, username, base64RsaEncryptedPassword, rsaKey.GetTimestamp(), authResult); if (authResult->IsEmailAuthNeeded() || authResult->IsCaptchaNeeded()) { do @@ -297,7 +229,7 @@ void CSteamProto::Authorize(SteamWebApi::AuthorizationApi::AuthResult *authResul } // try to authorize with emailauthcode or captcha taxt - SteamWebApi::AuthorizationApi::Authorize(m_hNetlibUser, username, base64RsaEncryptedPassword, timestamp, authResult); + SteamWebApi::AuthorizationApi::Authorize(m_hNetlibUser, username, base64RsaEncryptedPassword, rsaKey.GetTimestamp(), authResult); } while (authResult->IsEmailAuthNeeded() || authResult->IsCaptchaNeeded()); } } @@ -317,6 +249,8 @@ void CSteamProto::LogInThread(void* param) { // todo: dosplay error message from authResult.GetMessage() //ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_BADUSERID); + debugLogA("CSteamProto::Authorize: Error (%s)", authResult.GetMessage()); + m_iStatus = m_iDesiredStatus = ID_STATUS_OFFLINE; ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_CONNECTING, ID_STATUS_OFFLINE); return; @@ -324,6 +258,7 @@ void CSteamProto::LogInThread(void* param) token = authResult.GetToken(); setString("TokenSecret", token); + setString("Cookie", authResult.GetCookie()); setString("SteamID", authResult.GetSteamid()); } @@ -332,6 +267,7 @@ void CSteamProto::LogInThread(void* param) // if some error if (!loginResult.IsSuccess()) { + debugLogA("CSteamProto::login: Error"); // set status to offline m_iStatus = m_iDesiredStatus = ID_STATUS_OFFLINE; ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_CONNECTING, ID_STATUS_OFFLINE); -- cgit v1.2.3