// Copyright (c) 2010 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.
//
// NOTE: this file is Winodws specific.
#include "chrome/browser/sync/util/data_encryption.h"
#include <windows.h>
#include <wincrypt.h>
#include <cstddef>
#include <string>
#include <vector>
#include "base/logging.h"
using std::string;
using std::vector;
vector<uint8> EncryptData(const string& data) {
DATA_BLOB unencrypted_data = { 0 };
unencrypted_data.pbData = (BYTE*)(data.data());
unencrypted_data.cbData = data.size();
DATA_BLOB encrypted_data = { 0 };
if (!CryptProtectData(&unencrypted_data, L"", NULL, NULL, NULL, 0,
&encrypted_data))
LOG(ERROR) << "Encryption fails: " << data;
vector<uint8> result(encrypted_data.pbData,
encrypted_data.pbData + encrypted_data.cbData);
LocalFree(encrypted_data.pbData);
return result;
}
bool DecryptData(const vector<uint8>& in_data, string* out_data) {
DATA_BLOB encrypted_data, decrypted_data;
encrypted_data.pbData =
(in_data.empty() ? NULL : const_cast<BYTE*>(&in_data[0]));
encrypted_data.cbData = in_data.size();
LPWSTR descrip = L"";
if (!CryptUnprotectData(&encrypted_data, &descrip, NULL, NULL, NULL, 0,
&decrypted_data)) {
LOG(ERROR) << "Decryption fails: ";
return false;
} else {
out_data->assign(reinterpret_cast<const char*>(decrypted_data.pbData),
decrypted_data.cbData);
LocalFree(decrypted_data.pbData);
return true;
}
}