diff options
Diffstat (limited to 'chrome/browser/password_manager/encryptor.cc')
-rw-r--r-- | chrome/browser/password_manager/encryptor.cc | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/chrome/browser/password_manager/encryptor.cc b/chrome/browser/password_manager/encryptor.cc new file mode 100644 index 0000000..b5c0755 --- /dev/null +++ b/chrome/browser/password_manager/encryptor.cc @@ -0,0 +1,65 @@ +// 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 "chrome/browser/password_manager/encryptor.h" + +#include <windows.h> +#include <wincrypt.h> +#include "base/string_util.h" + +#pragma comment(lib, "crypt32.lib") + +bool Encryptor::EncryptWideString(const std::wstring& plaintext, + std::string* ciphertext) { + return EncryptString(WideToUTF8(plaintext), ciphertext); +} + +bool Encryptor::DecryptWideString(const std::string& ciphertext, + std::wstring* plaintext){ + std::string utf8; + if (!DecryptString(ciphertext, &utf8)) + return false; + + *plaintext = UTF8ToWide(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; +} |