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