// 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. #include "components/os_crypt/os_crypt.h" #include <windows.h> #include <wincrypt.h> #include "base/strings/utf_string_conversions.h" #pragma comment(lib, "crypt32.lib") bool OSCrypt::EncryptString16(const base::string16& plaintext, std::string* ciphertext) { return EncryptString(base::UTF16ToUTF8(plaintext), ciphertext); } bool OSCrypt::DecryptString16(const std::string& ciphertext, base::string16* plaintext) { std::string utf8; if (!DecryptString(ciphertext, &utf8)) return false; *plaintext = base::UTF8ToUTF16(utf8); return true; } bool OSCrypt::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 OSCrypt::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; }