OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chromeos/login/auth/cryptohome_authenticator.h" | 5 #include "chromeos/login/auth/cryptohome_authenticator.h" |
6 | 6 |
| 7 #include <vector> |
| 8 |
7 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
8 #include "base/bind.h" | 10 #include "base/bind.h" |
9 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" |
10 #include "base/location.h" | 12 #include "base/location.h" |
11 #include "base/logging.h" | 13 #include "base/logging.h" |
12 #include "chromeos/cryptohome/async_method_caller.h" | 14 #include "chromeos/cryptohome/async_method_caller.h" |
13 #include "chromeos/cryptohome/cryptohome_parameters.h" | 15 #include "chromeos/cryptohome/cryptohome_parameters.h" |
14 #include "chromeos/cryptohome/homedir_methods.h" | 16 #include "chromeos/cryptohome/homedir_methods.h" |
15 #include "chromeos/cryptohome/system_salt_getter.h" | 17 #include "chromeos/cryptohome/system_salt_getter.h" |
16 #include "chromeos/dbus/cryptohome_client.h" | 18 #include "chromeos/dbus/cryptohome_client.h" |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 } | 170 } |
169 | 171 |
170 // Callback invoked when cryptohome's GetKeyDataEx() method has finished. | 172 // Callback invoked when cryptohome's GetKeyDataEx() method has finished. |
171 // * If GetKeyDataEx() returned metadata indicating the hashing algorithm and | 173 // * If GetKeyDataEx() returned metadata indicating the hashing algorithm and |
172 // salt that were used to generate the key for this user's cryptohome, | 174 // salt that were used to generate the key for this user's cryptohome, |
173 // transforms the key in |attempt->user_context| with the same parameters. | 175 // transforms the key in |attempt->user_context| with the same parameters. |
174 // * Otherwise, starts the retrieval of the system salt so that the key in | 176 // * Otherwise, starts the retrieval of the system salt so that the key in |
175 // |attempt->user_context| can be transformed with Chrome's default hashing | 177 // |attempt->user_context| can be transformed with Chrome's default hashing |
176 // algorithm and the system salt. | 178 // algorithm and the system salt. |
177 // The resulting key is then passed to cryptohome's MountEx(). | 179 // The resulting key is then passed to cryptohome's MountEx(). |
178 void OnGetKeyDataEx(AuthAttemptState* attempt, | 180 void OnGetKeyDataEx( |
179 scoped_refptr<CryptohomeAuthenticator> resolver, | 181 AuthAttemptState* attempt, |
180 bool ephemeral, | 182 scoped_refptr<CryptohomeAuthenticator> resolver, |
181 bool create_if_nonexistent, | 183 bool ephemeral, |
182 bool success, | 184 bool create_if_nonexistent, |
183 cryptohome::MountError return_code, | 185 bool success, |
184 ScopedVector<cryptohome::RetrievedKeyData> key_data) { | 186 cryptohome::MountError return_code, |
| 187 const std::vector<cryptohome::KeyDefinition>& key_definitions) { |
185 if (success) { | 188 if (success) { |
186 if (key_data.size() == 1) { | 189 if (key_definitions.size() == 1) { |
187 cryptohome::RetrievedKeyData* key_data_entry = key_data.front(); | 190 const cryptohome::KeyDefinition& key_definition = key_definitions.front(); |
188 DCHECK_EQ(kCryptohomeGAIAKeyLabel, key_data_entry->label); | 191 DCHECK_EQ(kCryptohomeGAIAKeyLabel, key_definition.label); |
189 | 192 |
190 // Extract the key type and salt from |key_data|, if present. | 193 // Extract the key type and salt from |key_definition|, if present. |
191 scoped_ptr<int64> type; | 194 scoped_ptr<int64> type; |
192 scoped_ptr<std::string> salt; | 195 scoped_ptr<std::string> salt; |
193 for (ScopedVector<cryptohome::RetrievedKeyData::ProviderData>:: | 196 for (std::vector<cryptohome::KeyDefinition::ProviderData>:: |
194 const_iterator it = key_data_entry->provider_data.begin(); | 197 const_iterator it = key_definition.provider_data.begin(); |
195 it != key_data_entry->provider_data.end(); ++it) { | 198 it != key_definition.provider_data.end(); ++it) { |
196 if ((*it)->name == kKeyProviderDataTypeName) { | 199 if (it->name == kKeyProviderDataTypeName) { |
197 if ((*it)->number) | 200 if (it->number) |
198 type.reset(new int64(*(*it)->number)); | 201 type.reset(new int64(*it->number)); |
199 else | 202 else |
200 NOTREACHED(); | 203 NOTREACHED(); |
201 } else if ((*it)->name == kKeyProviderDataSaltName) { | 204 } else if (it->name == kKeyProviderDataSaltName) { |
202 if ((*it)->bytes) | 205 if (it->bytes) |
203 salt.reset(new std::string(*(*it)->bytes)); | 206 salt.reset(new std::string(*it->bytes)); |
204 else | 207 else |
205 NOTREACHED(); | 208 NOTREACHED(); |
206 } | 209 } |
207 } | 210 } |
208 | 211 |
209 if (type) { | 212 if (type) { |
210 if (*type < 0 || *type >= Key::KEY_TYPE_COUNT) { | 213 if (*type < 0 || *type >= Key::KEY_TYPE_COUNT) { |
211 LOG(ERROR) << "Invalid key type: " << *type; | 214 LOG(ERROR) << "Invalid key type: " << *type; |
212 RecordKeyErrorAndResolve(attempt, resolver); | 215 RecordKeyErrorAndResolve(attempt, resolver); |
213 return; | 216 return; |
214 } | 217 } |
215 | 218 |
216 if (!salt) { | 219 if (!salt) { |
217 LOG(ERROR) << "Missing salt."; | 220 LOG(ERROR) << "Missing salt."; |
218 RecordKeyErrorAndResolve(attempt, resolver); | 221 RecordKeyErrorAndResolve(attempt, resolver); |
219 return; | 222 return; |
220 } | 223 } |
221 | 224 |
222 attempt->user_context.GetKey()->Transform( | 225 attempt->user_context.GetKey()->Transform( |
223 static_cast<Key::KeyType>(*type), | 226 static_cast<Key::KeyType>(*type), |
224 *salt); | 227 *salt); |
225 DoMount(attempt, resolver, ephemeral, create_if_nonexistent); | 228 DoMount(attempt, resolver, ephemeral, create_if_nonexistent); |
226 return; | 229 return; |
227 } | 230 } |
228 } else { | 231 } else { |
229 LOG(ERROR) << "GetKeyDataEx() returned " << key_data.size() | 232 LOG(ERROR) << "GetKeyDataEx() returned " << key_definitions.size() |
230 << " entries."; | 233 << " entries."; |
231 } | 234 } |
232 } | 235 } |
233 | 236 |
234 SystemSaltGetter::Get()->GetSystemSalt(base::Bind(&OnGetSystemSalt, | 237 SystemSaltGetter::Get()->GetSystemSalt(base::Bind(&OnGetSystemSalt, |
235 attempt, | 238 attempt, |
236 resolver, | 239 resolver, |
237 ephemeral, | 240 ephemeral, |
238 create_if_nonexistent)); | 241 create_if_nonexistent)); |
239 } | 242 } |
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
918 Resolve(); | 921 Resolve(); |
919 } | 922 } |
920 | 923 |
921 void CryptohomeAuthenticator::SetOwnerState(bool owner_check_finished, | 924 void CryptohomeAuthenticator::SetOwnerState(bool owner_check_finished, |
922 bool check_result) { | 925 bool check_result) { |
923 owner_is_verified_ = owner_check_finished; | 926 owner_is_verified_ = owner_check_finished; |
924 user_can_login_ = check_result; | 927 user_can_login_ = check_result; |
925 } | 928 } |
926 | 929 |
927 } // namespace chromeos | 930 } // namespace chromeos |
OLD | NEW |