Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(168)

Side by Side Diff: chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.cc

Issue 554043003: cros: Create cryptohome keys for Easy sign-in. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix use-after-free Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.h"
6
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "base/strings/stringprintf.h"
10 #include "base/values.h"
11
12 namespace chromeos {
13
14 namespace {
15
16 const char kKeyBluetoothAddress[] = "bluetoothAddress";
17 const char kKeyPermitRecord[] = "permitRecord";
18 const char kKeyId[] = "id";
19 const char kKeyPermitId[] = "permitRecord.id";
20 const char kKeyPsk[] = "psk";
21
22 const char kKeyLabelPrefix[] = "easy-unlock-";
23
24 } // namespace
25
26 EasyUnlockKeyManager::EasyUnlockKeyManager() : weak_ptr_factory_(this) {
27 }
28
29 EasyUnlockKeyManager::~EasyUnlockKeyManager() {
30 }
31
32 void EasyUnlockKeyManager::CreateKeys(
33 const UserContext& user_context,
34 const base::ListValue& remote_devices,
35 const CreateKeysCallback& callback) {
36 // Must have the secret.
37 DCHECK(!user_context.GetKey()->GetSecret().empty());
38
39 EasyUnlockDeviceKeyDataList devices;
40 if (!RemoteDeviceListToDeviceDataList(remote_devices, &devices)) {
tbarzic 2014/09/09 19:32:21 Should we remove keys even in case the remote_devi
xiyuan 2014/09/09 20:25:30 Makes sense. Updated to code to use empty |devices
41 LOG(ERROR) << "Error parsing remote device list.";
42 callback.Run(false);
43 return;
44 }
45
46 // Only one pending request.
47 DCHECK(!create_keys_op_);
48 create_keys_op_.reset(new EasyUnlockCreateKeysOperation(
tbarzic 2014/09/09 19:32:21 Would it make sence to do this in OnKeysRemovedFor
xiyuan 2014/09/09 20:25:30 Done.
49 user_context,
50 devices,
51 base::Bind(&EasyUnlockKeyManager::OnKeysCreated,
52 weak_ptr_factory_.GetWeakPtr(),
53 callback)));
54
55 // Remove existing keys before creating new ones.
56 RemoveKeys(user_context,
57 base::Bind(&EasyUnlockKeyManager::OnKeysRemovedForCreateKeys,
58 weak_ptr_factory_.GetWeakPtr(),
59 callback));
60 }
61
62 void EasyUnlockKeyManager::RemoveKeys(const UserContext& user_context,
63 const RemoveKeysCallback& callback) {
64 // Must have the secret.
65 DCHECK(!user_context.GetKey()->GetSecret().empty());
66 // Only one pending request.
67 DCHECK(!remove_keys_op_);
68
69 remove_keys_op_.reset(
70 new EasyUnlockRemoveKeysOperation(
71 user_context,
72 base::Bind(&EasyUnlockKeyManager::OnKeysRemoved,
73 weak_ptr_factory_.GetWeakPtr(),
74 callback)));
75 remove_keys_op_->Start();
76 }
77
78 void EasyUnlockKeyManager::GetDeviceDataList(
79 const UserContext& user_context,
80 const GetDeviceDataListCallback& callback) {
81 // Only one pending request.
82 DCHECK(!get_keys_op_);
83
84 get_keys_op_.reset(new EasyUnlockGetKeysOperation(
85 user_context,
86 base::Bind(&EasyUnlockKeyManager::OnKeysFetched,
87 weak_ptr_factory_.GetWeakPtr(),
88 callback)));
89 get_keys_op_->Start();
90 }
91
92 // static
93 void EasyUnlockKeyManager::DeviceDataToRemoteDeviceDictionary(
94 const EasyUnlockDeviceKeyData& data,
95 base::DictionaryValue* dict) {
96 dict->SetString(kKeyBluetoothAddress, data.bluetooth_address);
97 dict->SetString(kKeyPsk, data.psk);
98 scoped_ptr<base::DictionaryValue> permit_record(new base::DictionaryValue);
99 permit_record->SetString(kKeyId, data.public_key);
100 dict->Set(kKeyPermitRecord, permit_record.release());
101 }
102
103 // static
104 bool EasyUnlockKeyManager::RemoteDeviceDictionaryToDeviceData(
105 const base::DictionaryValue& dict,
106 EasyUnlockDeviceKeyData* data) {
107 return dict.GetString(kKeyBluetoothAddress, &data->bluetooth_address) &&
108 dict.GetString(kKeyPermitId, &data->public_key) &&
109 dict.GetString(kKeyPsk, &data->psk);
110 }
111
112 // static
113 void EasyUnlockKeyManager::DeviceDataListToRemoteDeviceList(
114 const EasyUnlockDeviceKeyDataList& data_list,
115 base::ListValue* device_list) {
116 device_list->Clear();
117 for (size_t i = 0; i < data_list.size(); ++i) {
118 scoped_ptr<base::DictionaryValue> device_dict(new base::DictionaryValue);
119 DeviceDataToRemoteDeviceDictionary(data_list[i], device_dict.get());
120 device_list->Append(device_dict.release());
121 }
122 }
123
124 // static
125 bool EasyUnlockKeyManager::RemoteDeviceListToDeviceDataList(
126 const base::ListValue& device_list,
127 EasyUnlockDeviceKeyDataList* data_list) {
128 EasyUnlockDeviceKeyDataList parsed_devices;
129 for (base::ListValue::const_iterator it = device_list.begin();
130 it != device_list.end();
131 ++it) {
132 const base::DictionaryValue* dict;
133 if (!(*it)->GetAsDictionary(&dict) || !dict)
134 return false;
135
136 EasyUnlockDeviceKeyData data;
137 if (!RemoteDeviceDictionaryToDeviceData(*dict, &data))
138 return false;
139
140 parsed_devices.push_back(data);
141 }
142
143 data_list->swap(parsed_devices);
144 return true;
145 }
146
147 // static
148 std::string EasyUnlockKeyManager::GetKeyLabel(int key_index) {
149 return base::StringPrintf("%s%d", kKeyLabelPrefix, key_index);
150 }
151
152 void EasyUnlockKeyManager::OnKeysRemovedForCreateKeys(
153 const CreateKeysCallback& callback,
154 bool remove_success) {
155 if (!remove_success) {
156 callback.Run(false);
157 return;
158 }
159
160 // Only one pending request.
161 DCHECK(!create_keys_op_);
tbarzic 2014/09/09 19:32:21 I think you meant DCHECK(create_leys_op_)
xiyuan 2014/09/09 20:25:30 Yep.
162 create_keys_op_->Start();
163 }
164
165 void EasyUnlockKeyManager::OnKeysCreated(const CreateKeysCallback& callback,
166 bool create_success) {
167 scoped_ptr<EasyUnlockCreateKeysOperation> op = create_keys_op_.Pass();
168 if (!callback.is_null())
169 callback.Run(create_success);
170 }
171
172 void EasyUnlockKeyManager::OnKeysRemoved(const RemoveKeysCallback& callback,
173 bool remove_success) {
174 scoped_ptr<EasyUnlockRemoveKeysOperation> op = remove_keys_op_.Pass();
175 if (!callback.is_null())
176 callback.Run(remove_success);
177 }
178
179 void EasyUnlockKeyManager::OnKeysFetched(
180 const GetDeviceDataListCallback& callback,
181 bool fetch_success,
182 const EasyUnlockDeviceKeyDataList& fetched_data) {
183 scoped_ptr<EasyUnlockGetKeysOperation> op = get_keys_op_.Pass();
184 if (!callback.is_null())
185 callback.Run(fetch_success, fetched_data);
186 }
187
188 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698