// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_OS_CRYPT_IE7_PASSWORD_WIN_H_
#define COMPONENTS_OS_CRYPT_IE7_PASSWORD_WIN_H_

#include <windows.h>
#include <string>
#include <vector>

#include "base/basictypes.h"
#include "base/time/time.h"

// Contains the information read from the IE7/IE8 Storage2 key in the registry.
struct IE7PasswordInfo {
  // Hash of the url.
  std::wstring url_hash;

  // Encrypted data containing the username, password and some more undocumented
  // fields.
  std::vector<unsigned char> encrypted_data;

  // When the login was imported.
  base::Time date_created;
};

namespace ie7_password {

struct DecryptedCredentials {
  std::wstring username;
  std::wstring password;
};

// Parses a data structure to find passwords and usernames.
// The collection of bytes in |data| is interpreted as a special PasswordEntry
// structure. IE saves the login information as a binary dump of this structure.
// Credentials extracted from |data| end up in |credentials|.
bool GetUserPassFromData(const std::vector<unsigned char>& data,
                         std::vector<DecryptedCredentials>* credentials);

// Decrypts usernames and passwords for a given data vector using the url as
// the key.
// Output ends up in |credentials|.
bool DecryptPasswords(const std::wstring& url,
                      const std::vector<unsigned char>& data,
                      std::vector<DecryptedCredentials>* credentials);

// Returns the hash of a url.
std::wstring GetUrlHash(const std::wstring& url);

}  // namespace ie7_password

#endif  // COMPONENTS_OS_CRYPT_IE7_PASSWORD_WIN_H_
