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

Side by Side Diff: chrome/browser/chromeos/login/easy_unlock/easy_unlock_get_keys_operation.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_get_keys_operati on.h"
6
7 #include <vector>
8
9 #include "base/bind.h"
10 #include "base/logging.h"
11 #include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.h"
12 #include "google_apis/gaia/gaia_auth_util.h"
13
14 namespace chromeos {
15
16 EasyUnlockGetKeysOperation::EasyUnlockGetKeysOperation(
17 const UserContext& user_context,
18 const GetKeysCallback& callback)
19 : user_context_(user_context),
20 callback_(callback),
21 key_index_(-1),
22 weak_ptr_factory_(this) {
23 }
24
25 EasyUnlockGetKeysOperation::~EasyUnlockGetKeysOperation() {
26 }
27
28 void EasyUnlockGetKeysOperation::Start() {
29 // TODO(xiyuan): Use ListKeyEx.
30 key_index_ = 0;
31 GetKeyData();
32 }
33
34 void EasyUnlockGetKeysOperation::GetKeyData() {
35 std::string canonicalized =
36 gaia::CanonicalizeEmail(user_context_.GetUserID());
37 cryptohome::Identification id(canonicalized);
38 cryptohome::HomedirMethods::GetInstance()->GetKeyDataEx(
39 id,
40 EasyUnlockKeyManager::GetKeyLabel(key_index_),
41 base::Bind(&EasyUnlockGetKeysOperation::OnGetKeyData,
42 weak_ptr_factory_.GetWeakPtr()));
43
44 }
45
46 void EasyUnlockGetKeysOperation::OnGetKeyData(
47 bool success,
48 cryptohome::MountError return_code,
49 ScopedVector<cryptohome::RetrievedKeyData> retrieved_data) {
50 if (!success || retrieved_data.empty()) {
51 // MOUNT_ERROR_KEY_FAILURE is considered as success. Other error codes are
52 // treated as failures.
53 if (return_code == cryptohome::MOUNT_ERROR_NONE ||
54 return_code == cryptohome::MOUNT_ERROR_KEY_FAILURE) {
55 callback_.Run(true, devices_);
56 return;
57 }
58
59 LOG(ERROR) << "Easy unlock failed to get key data, code=" << return_code;
tbarzic 2014/09/09 19:32:21 Are you missing callback_.Run(false, EasyUnlockDev
xiyuan 2014/09/09 20:25:30 Good catch. Fixed.
60 return;
61 }
62
63 DCHECK_EQ(1u, retrieved_data.size());
64
65 const std::vector<cryptohome::ProviderDataEntry>& provider_data =
66 retrieved_data.front()->provider_data;
67
68 EasyUnlockDeviceKeyData device;
69 for (size_t i = 0; i < provider_data.size(); ++i) {
70 const cryptohome::ProviderDataEntry& entry = provider_data[i];
71 if (entry.name == kEasyUnlockKeyMetaNameBluetoothAddress) {
72 if (entry.has_bytes)
73 device.bluetooth_address = entry.bytes;
74 else
75 NOTREACHED();
76 } else if (entry.name == kEasyUnlockKeyMetaNamePubKey) {
77 if (entry.has_bytes)
78 device.public_key = entry.bytes;
79 else
80 NOTREACHED();
81 } else if (entry.name == kEasyUnlockKeyMetaNamePsk) {
82 if (entry.has_bytes)
83 device.psk = entry.bytes;
84 else
85 NOTREACHED();
86 } else if (entry.name == kEasyUnlockKeyMetaNameChallenge) {
87 if (entry.has_bytes)
88 device.challenge = entry.bytes;
89 else
90 NOTREACHED();
91 } else if (entry.name == kEasyUnlockKeyMetaNameWrappedSecret) {
92 if (entry.has_bytes)
93 device.wrapped_secret = entry.bytes;
94 else
95 NOTREACHED();
96 } else {
97 LOG(WARNING) << "Unknown Easy unlock key data entry, name="
98 << entry.name;
99 }
100 }
101 devices_.push_back(device);
102
103 ++key_index_;
104 GetKeyData();
105 }
106
107 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698