| // Copyright (c) 2006-2008 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. |
| |
| #include "components/webdata/encryptor/encryptor.h" |
| |
| #include <windows.h> |
| #include <wincrypt.h> |
| #include "base/utf_string_conversions.h" |
| |
| #pragma comment(lib, "crypt32.lib") |
| |
| bool Encryptor::EncryptString16(const string16& plaintext, |
| std::string* ciphertext) { |
| return EncryptString(UTF16ToUTF8(plaintext), ciphertext); |
| } |
| |
| bool Encryptor::DecryptString16(const std::string& ciphertext, |
| string16* plaintext) { |
| std::string utf8; |
| if (!DecryptString(ciphertext, &utf8)) |
| return false; |
| |
| *plaintext = UTF8ToUTF16(utf8); |
| return true; |
| } |
| |
| bool Encryptor::EncryptString(const std::string& plaintext, |
| std::string* ciphertext) { |
| DATA_BLOB input; |
| input.pbData = const_cast<BYTE*>( |
| reinterpret_cast<const BYTE*>(plaintext.data())); |
| input.cbData = static_cast<DWORD>(plaintext.length()); |
| |
| DATA_BLOB output; |
| BOOL result = CryptProtectData(&input, L"", NULL, NULL, NULL, |
| 0, &output); |
| if (!result) |
| return false; |
| |
| // this does a copy |
| ciphertext->assign(reinterpret_cast<std::string::value_type*>(output.pbData), |
| output.cbData); |
| |
| LocalFree(output.pbData); |
| return true; |
| } |
| |
| bool Encryptor::DecryptString(const std::string& ciphertext, |
| std::string* plaintext) { |
| DATA_BLOB input; |
| input.pbData = const_cast<BYTE*>( |
| reinterpret_cast<const BYTE*>(ciphertext.data())); |
| input.cbData = static_cast<DWORD>(ciphertext.length()); |
| |
| DATA_BLOB output; |
| BOOL result = CryptUnprotectData(&input, NULL, NULL, NULL, NULL, |
| 0, &output); |
| if (!result) |
| return false; |
| |
| plaintext->assign(reinterpret_cast<char*>(output.pbData), output.cbData); |
| LocalFree(output.pbData); |
| return true; |
| } |