1// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/password_manager/encryptor.h"
6
7#include <windows.h>
8#include <wincrypt.h>
9#include "base/utf_string_conversions.h"
10
11#pragma comment(lib, "crypt32.lib")
12
13bool Encryptor::EncryptString16(const string16& plaintext,
14                                std::string* ciphertext) {
15  return EncryptString(UTF16ToUTF8(plaintext), ciphertext);
16}
17
18bool Encryptor::DecryptString16(const std::string& ciphertext,
19                                string16* plaintext) {
20  std::string utf8;
21  if (!DecryptString(ciphertext, &utf8))
22    return false;
23
24  *plaintext = UTF8ToUTF16(utf8);
25  return true;
26}
27
28bool Encryptor::EncryptString(const std::string& plaintext,
29                              std::string* ciphertext) {
30  DATA_BLOB input;
31  input.pbData = const_cast<BYTE*>(
32      reinterpret_cast<const BYTE*>(plaintext.data()));
33  input.cbData = static_cast<DWORD>(plaintext.length());
34
35  DATA_BLOB output;
36  BOOL result = CryptProtectData(&input, L"", NULL, NULL, NULL,
37                                 0, &output);
38  if (!result)
39    return false;
40
41  // this does a copy
42  ciphertext->assign(reinterpret_cast<std::string::value_type*>(output.pbData),
43                     output.cbData);
44
45  LocalFree(output.pbData);
46  return true;
47}
48
49bool Encryptor::DecryptString(const std::string& ciphertext,
50                              std::string* plaintext) {
51  DATA_BLOB input;
52  input.pbData = const_cast<BYTE*>(
53      reinterpret_cast<const BYTE*>(ciphertext.data()));
54  input.cbData = static_cast<DWORD>(ciphertext.length());
55
56  DATA_BLOB output;
57  BOOL result = CryptUnprotectData(&input, NULL, NULL, NULL, NULL,
58                                   0, &output);
59  if (!result)
60    return false;
61
62  plaintext->assign(reinterpret_cast<char*>(output.pbData), output.cbData);
63  LocalFree(output.pbData);
64  return true;
65}
66