13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NOTE: this file is Winodws specific. 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/util/data_encryption.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <windows.h> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <wincrypt.h> 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <cstddef> 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/logging.h" 173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing std::string; 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing std::vector; 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvector<uint8> EncryptData(const string& data) { 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DATA_BLOB unencrypted_data = { 0 }; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unencrypted_data.pbData = (BYTE*)(data.data()); 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unencrypted_data.cbData = data.size(); 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DATA_BLOB encrypted_data = { 0 }; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!CryptProtectData(&unencrypted_data, L"", NULL, NULL, NULL, 0, 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &encrypted_data)) 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Encryption fails: " << data; 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch vector<uint8> result(encrypted_data.pbData, 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch encrypted_data.pbData + encrypted_data.cbData); 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LocalFree(encrypted_data.pbData); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return result; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool DecryptData(const vector<uint8>& in_data, string* out_data) { 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DATA_BLOB encrypted_data, decrypted_data; 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch encrypted_data.pbData = 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (in_data.empty() ? NULL : const_cast<BYTE*>(&in_data[0])); 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch encrypted_data.cbData = in_data.size(); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LPWSTR descrip = L""; 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!CryptUnprotectData(&encrypted_data, &descrip, NULL, NULL, NULL, 0, 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &decrypted_data)) { 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Decryption fails: "; 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch out_data->assign(reinterpret_cast<const char*>(decrypted_data.pbData), 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch decrypted_data.cbData); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LocalFree(decrypted_data.pbData); 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 55