| Index: components/webdata/encryptor/ie7_password_win.cc
|
| diff --git a/components/webdata/encryptor/ie7_password.cc b/components/webdata/encryptor/ie7_password_win.cc
|
| similarity index 76%
|
| rename from components/webdata/encryptor/ie7_password.cc
|
| rename to components/webdata/encryptor/ie7_password_win.cc
|
| index e7db3ab3be0268842fc8415417668b81b4524a7b..c5ed4ffe5ad0522d3fad100e526b745198c824f3 100644
|
| --- a/components/webdata/encryptor/ie7_password.cc
|
| +++ b/components/webdata/encryptor/ie7_password_win.cc
|
| @@ -2,7 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "components/webdata/encryptor/ie7_password.h"
|
| +#include "components/webdata/encryptor/ie7_password_win.h"
|
|
|
| #include <wincrypt.h>
|
| #include <string>
|
| @@ -28,8 +28,7 @@ struct Header {
|
| char wick[4]; // The string "WICK". I don't know what it means.
|
| DWORD fixed_header_size; // The size of this structure without the entries:
|
| // sizeof(Header).
|
| - DWORD item_count; // Number of entries. It should always be 2. One for
|
| - // the username, and one for the password.
|
| + DWORD item_count; // Number of entries. Should be even.
|
| wchar_t two_letters[2]; // Two unknown bytes.
|
| DWORD unknown[2]; // Two unknown DWORDs.
|
| };
|
| @@ -45,17 +44,16 @@ struct Entry {
|
| struct PasswordEntry {
|
| PreHeader pre_header; // Contains the size of the different sections.
|
| Header header; // Contains the number of items.
|
| - Entry entry[1]; // List of entries containing a string. The first one
|
| - // is the username, the second one if the password.
|
| + Entry entry[1]; // List of entries containing a string. Even-indexed
|
| + // are usernames, odd are passwords. There may be
|
| + // several sets saved for a single url hash.
|
| };
|
| -
|
| } // namespace
|
|
|
| namespace ie7_password {
|
|
|
| bool GetUserPassFromData(const std::vector<unsigned char>& data,
|
| - std::wstring* username,
|
| - std::wstring* password) {
|
| + std::vector<DecryptedCredentials>* credentials) {
|
| const PasswordEntry* information =
|
| reinterpret_cast<const PasswordEntry*>(&data.front());
|
|
|
| @@ -64,23 +62,29 @@ bool GetUserPassFromData(const std::vector<unsigned char>& data,
|
| if (information->pre_header.pre_header_size != sizeof(PreHeader))
|
| return false;
|
|
|
| - if (information->header.item_count != 2) // Username and Password
|
| + const int entry_count = information->header.item_count;
|
| + if (entry_count % 2) // Usernames and Passwords
|
| return false;
|
|
|
| if (information->header.fixed_header_size != sizeof(Header))
|
| return false;
|
|
|
| - const uint8* ptr = &data.front();
|
| - const uint8* offset_to_data = ptr + information->pre_header.header_size +
|
| + const uint8* offset_to_data = &data[0] +
|
| + information->pre_header.header_size +
|
| information->pre_header.pre_header_size;
|
|
|
| - const Entry* user_entry = information->entry;
|
| - const Entry* pass_entry = user_entry+1;
|
| + for (int i = 0; i < entry_count / 2; ++i) {
|
| +
|
| + const Entry* user_entry = &information->entry[2*i];
|
| + const Entry* pass_entry = user_entry+1;
|
|
|
| - *username = reinterpret_cast<const wchar_t*>(offset_to_data +
|
| - user_entry->offset);
|
| - *password = reinterpret_cast<const wchar_t*>(offset_to_data +
|
| - pass_entry->offset);
|
| + DecryptedCredentials c;
|
| + c.username = reinterpret_cast<const wchar_t*>(offset_to_data +
|
| + user_entry->offset);
|
| + c.password = reinterpret_cast<const wchar_t*>(offset_to_data +
|
| + pass_entry->offset);
|
| + credentials->push_back(c);
|
| + }
|
| return true;
|
| }
|
|
|
| @@ -108,9 +112,9 @@ std::wstring GetUrlHash(const std::wstring& url) {
|
| return url_hash;
|
| }
|
|
|
| -bool DecryptPassword(const std::wstring& url,
|
| - const std::vector<unsigned char>& data,
|
| - std::wstring* username, std::wstring* password) {
|
| +bool DecryptPasswords(const std::wstring& url,
|
| + const std::vector<unsigned char>& data,
|
| + std::vector<DecryptedCredentials>* credentials) {
|
| std::wstring lower_case_url = StringToLowerASCII(url);
|
| DATA_BLOB input = {0};
|
| DATA_BLOB output = {0};
|
| @@ -132,7 +136,7 @@ bool DecryptPassword(const std::wstring& url,
|
| decrypted_data.resize(output.cbData);
|
| memcpy(&decrypted_data.front(), output.pbData, output.cbData);
|
|
|
| - GetUserPassFromData(decrypted_data, username, password);
|
| + GetUserPassFromData(decrypted_data, credentials);
|
|
|
| LocalFree(output.pbData);
|
| return true;
|
|
|