OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "crypto/nss_util.h" | 5 #include "crypto/nss_util.h" |
6 #include "crypto/nss_util_internal.h" | 6 #include "crypto/nss_util_internal.h" |
7 | 7 |
8 #include <nss.h> | 8 #include <nss.h> |
9 #include <pk11pub.h> | 9 #include <pk11pub.h> |
10 #include <plarena.h> | 10 #include <plarena.h> |
11 #include <prerror.h> | 11 #include <prerror.h> |
12 #include <prinit.h> | 12 #include <prinit.h> |
13 #include <prtime.h> | 13 #include <prtime.h> |
14 #include <secmod.h> | 14 #include <secmod.h> |
15 | 15 |
16 #if defined(OS_LINUX) | 16 #if defined(OS_LINUX) |
17 #include <linux/nfs_fs.h> | 17 #include <linux/nfs_fs.h> |
18 #include <sys/vfs.h> | 18 #include <sys/vfs.h> |
19 #elif defined(OS_OPENBSD) | 19 #elif defined(OS_OPENBSD) |
20 #include <sys/mount.h> | 20 #include <sys/mount.h> |
21 #include <sys/param.h> | 21 #include <sys/param.h> |
22 #endif | 22 #endif |
23 | 23 |
| 24 #include <map> |
24 #include <vector> | 25 #include <vector> |
25 | 26 |
| 27 #include "base/callback.h" |
26 #include "base/debug/alias.h" | 28 #include "base/debug/alias.h" |
27 #include "base/environment.h" | 29 #include "base/environment.h" |
28 #include "base/file_util.h" | 30 #include "base/file_util.h" |
29 #include "base/files/file_path.h" | 31 #include "base/files/file_path.h" |
30 #include "base/files/scoped_temp_dir.h" | 32 #include "base/files/scoped_temp_dir.h" |
31 #include "base/lazy_instance.h" | 33 #include "base/lazy_instance.h" |
32 #include "base/logging.h" | 34 #include "base/logging.h" |
33 #include "base/memory/scoped_ptr.h" | 35 #include "base/memory/scoped_ptr.h" |
34 #include "base/metrics/histogram.h" | 36 #include "base/metrics/histogram.h" |
35 #include "base/native_library.h" | 37 #include "base/native_library.h" |
| 38 #include "base/stl_util.h" |
36 #include "base/strings/stringprintf.h" | 39 #include "base/strings/stringprintf.h" |
37 #include "base/threading/thread_restrictions.h" | 40 #include "base/threading/thread_restrictions.h" |
38 #include "build/build_config.h" | 41 #include "build/build_config.h" |
39 | 42 |
40 // USE_NSS means we use NSS for everything crypto-related. If USE_NSS is not | 43 // USE_NSS means we use NSS for everything crypto-related. If USE_NSS is not |
41 // defined, such as on Mac and Windows, we use NSS for SSL only -- we don't | 44 // defined, such as on Mac and Windows, we use NSS for SSL only -- we don't |
42 // use NSS for crypto or certificate verification, and we don't use the NSS | 45 // use NSS for crypto or certificate verification, and we don't use the NSS |
43 // certificate and key databases. | 46 // certificate and key databases. |
44 #if defined(USE_NSS) | 47 #if defined(USE_NSS) |
45 #include "base/synchronization/lock.h" | 48 #include "base/synchronization/lock.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 base::FilePath dir = file_util::GetHomeDir(); | 82 base::FilePath dir = file_util::GetHomeDir(); |
80 if (dir.empty()) { | 83 if (dir.empty()) { |
81 LOG(ERROR) << "Failed to get home directory."; | 84 LOG(ERROR) << "Failed to get home directory."; |
82 return dir; | 85 return dir; |
83 } | 86 } |
84 dir = dir.AppendASCII(".pki").AppendASCII("nssdb"); | 87 dir = dir.AppendASCII(".pki").AppendASCII("nssdb"); |
85 if (!file_util::CreateDirectory(dir)) { | 88 if (!file_util::CreateDirectory(dir)) { |
86 LOG(ERROR) << "Failed to create " << dir.value() << " directory."; | 89 LOG(ERROR) << "Failed to create " << dir.value() << " directory."; |
87 dir.clear(); | 90 dir.clear(); |
88 } | 91 } |
| 92 VLOG(1) << "DefaultConfigDirectory: " << dir.value(); |
89 return dir; | 93 return dir; |
90 } | 94 } |
91 | 95 |
92 // On non-Chrome OS platforms, return the default config directory. On Chrome OS | 96 // On non-Chrome OS platforms, return the default config directory. On Chrome OS |
93 // test images, return a read-only directory with fake root CA certs (which are | 97 // test images, return a read-only directory with fake root CA certs (which are |
94 // used by the local Google Accounts server mock we use when testing our login | 98 // used by the local Google Accounts server mock we use when testing our login |
95 // code). On Chrome OS non-test images (where the read-only directory doesn't | 99 // code). On Chrome OS non-test images (where the read-only directory doesn't |
96 // exist), return an empty path. | 100 // exist), return an empty path. |
97 base::FilePath GetInitialConfigDirectory() { | 101 base::FilePath GetInitialConfigDirectory() { |
98 #if defined(OS_CHROMEOS) | 102 #if defined(OS_CHROMEOS) |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 void CrashOnNSSInitFailure() { | 210 void CrashOnNSSInitFailure() { |
207 int nss_error = PR_GetError(); | 211 int nss_error = PR_GetError(); |
208 int os_error = PR_GetOSError(); | 212 int os_error = PR_GetOSError(); |
209 base::debug::Alias(&nss_error); | 213 base::debug::Alias(&nss_error); |
210 base::debug::Alias(&os_error); | 214 base::debug::Alias(&os_error); |
211 LOG(ERROR) << "Error initializing NSS without a persistent database: " | 215 LOG(ERROR) << "Error initializing NSS without a persistent database: " |
212 << GetNSSErrorMessage(); | 216 << GetNSSErrorMessage(); |
213 LOG(FATAL) << "nss_error=" << nss_error << ", os_error=" << os_error; | 217 LOG(FATAL) << "nss_error=" << nss_error << ", os_error=" << os_error; |
214 } | 218 } |
215 | 219 |
| 220 #if defined(OS_CHROMEOS) |
| 221 class ChromeOSUserData { |
| 222 public: |
| 223 ChromeOSUserData(ScopedPK11Slot public_slot, bool is_primary_user) |
| 224 : public_slot_(public_slot.Pass()), is_primary_user_(is_primary_user) {} |
| 225 ~ChromeOSUserData() { |
| 226 // Don't close when NSS is < 3.15.1, because it would require an additional |
| 227 // sleep for 1 second after closing the database, due to |
| 228 // http://bugzil.la/875601. |
| 229 if (NSS_VersionCheck("3.15.1")) { |
| 230 if (public_slot_ && !is_primary_user_) { |
| 231 SECStatus status = SECMOD_CloseUserDB(public_slot_.get()); |
| 232 if (status != SECSuccess) |
| 233 PLOG(ERROR) << "SECMOD_CloseUserDB failed: " << PORT_GetError(); |
| 234 } |
| 235 } |
| 236 } |
| 237 |
| 238 ScopedPK11Slot GetPublicSlot() { |
| 239 return ScopedPK11Slot(public_slot_ ? PK11_ReferenceSlot(public_slot_.get()) |
| 240 : NULL); |
| 241 } |
| 242 |
| 243 ScopedPK11Slot GetPrivateSlot() { |
| 244 return ScopedPK11Slot( |
| 245 private_slot_ ? PK11_ReferenceSlot(private_slot_.get()) : NULL); |
| 246 } |
| 247 |
| 248 void OnPrivateSlotReady( |
| 249 const base::Callback<void(ScopedPK11Slot)>& callback) { |
| 250 if (private_slot_) |
| 251 callback.Run(GetPrivateSlot()); |
| 252 else |
| 253 tpm_ready_callback_list_.push_back(callback); |
| 254 } |
| 255 |
| 256 void SetPrivateSlot(ScopedPK11Slot private_slot) { |
| 257 DCHECK(!private_slot_); |
| 258 private_slot_ = private_slot.Pass(); |
| 259 |
| 260 for (SlotReadyCallbackList::iterator i = tpm_ready_callback_list_.begin(); |
| 261 i != tpm_ready_callback_list_.end(); |
| 262 ++i) { |
| 263 (*i).Run(GetPrivateSlot()); |
| 264 } |
| 265 tpm_ready_callback_list_.clear(); |
| 266 } |
| 267 |
| 268 private: |
| 269 ScopedPK11Slot public_slot_; |
| 270 ScopedPK11Slot private_slot_; |
| 271 bool is_primary_user_; |
| 272 |
| 273 typedef std::vector<base::Callback<void(ScopedPK11Slot)> > |
| 274 SlotReadyCallbackList; |
| 275 SlotReadyCallbackList tpm_ready_callback_list_; |
| 276 }; |
| 277 #endif // defined(OS_CHROMEOS) |
| 278 |
216 class NSSInitSingleton { | 279 class NSSInitSingleton { |
217 public: | 280 public: |
218 #if defined(OS_CHROMEOS) | 281 #if defined(OS_CHROMEOS) |
219 void OpenPersistentNSSDB() { | 282 void OpenPersistentNSSDB() { |
220 if (!chromeos_user_logged_in_) { | 283 if (!chromeos_user_logged_in_) { |
221 // GetDefaultConfigDirectory causes us to do blocking IO on UI thread. | 284 // GetDefaultConfigDirectory causes us to do blocking IO on UI thread. |
222 // Temporarily allow it until we fix http://crbug.com/70119 | 285 // Temporarily allow it until we fix http://crbug.com/70119 |
223 base::ThreadRestrictions::ScopedAllowIO allow_io; | 286 base::ThreadRestrictions::ScopedAllowIO allow_io; |
224 chromeos_user_logged_in_ = true; | 287 chromeos_user_logged_in_ = true; |
225 | 288 |
226 // This creates another DB slot in NSS that is read/write, unlike | 289 // This creates another DB slot in NSS that is read/write, unlike |
227 // the fake root CA cert DB and the "default" crypto key | 290 // the fake root CA cert DB and the "default" crypto key |
228 // provider, which are still read-only (because we initialized | 291 // provider, which are still read-only (because we initialized |
229 // NSS before we had a cryptohome mounted). | 292 // NSS before we had a cryptohome mounted). |
230 software_slot_ = OpenUserDB(GetDefaultConfigDirectory(), | 293 software_slot_ = OpenUserDB(GetDefaultConfigDirectory(), |
231 kNSSDatabaseName); | 294 kNSSDatabaseName); |
232 } | 295 } |
233 } | 296 } |
234 | 297 |
| 298 PK11SlotInfo* OpenPersistentNSSDBForPath(const base::FilePath& path) { |
| 299 VLOG(1) << __func__ << " " << path.value(); |
| 300 // We do NSS file io on the IO thread. |
| 301 base::ThreadRestrictions::ScopedAllowIO allow_io; |
| 302 |
| 303 base::FilePath nssdb_path = path.AppendASCII(".pki").AppendASCII("nssdb"); |
| 304 if (!file_util::CreateDirectory(nssdb_path)) { |
| 305 LOG(ERROR) << "Failed to create " << nssdb_path.value() << " directory."; |
| 306 return NULL; |
| 307 } |
| 308 return OpenUserDB(nssdb_path, kNSSDatabaseName); |
| 309 } |
| 310 |
235 void EnableTPMTokenForNSS() { | 311 void EnableTPMTokenForNSS() { |
236 // If this gets set, then we'll use the TPM for certs with | 312 // If this gets set, then we'll use the TPM for certs with |
237 // private keys, otherwise we'll fall back to the software | 313 // private keys, otherwise we'll fall back to the software |
238 // implementation. | 314 // implementation. |
239 tpm_token_enabled_for_nss_ = true; | 315 tpm_token_enabled_for_nss_ = true; |
240 } | 316 } |
241 | 317 |
| 318 bool IsTPMTokenEnabledForNSS() { |
| 319 return tpm_token_enabled_for_nss_; |
| 320 } |
| 321 |
242 bool InitializeTPMToken(const std::string& token_name, | 322 bool InitializeTPMToken(const std::string& token_name, |
243 int token_slot_id, | 323 int token_slot_id, |
244 const std::string& user_pin) { | 324 const std::string& user_pin) { |
245 // If EnableTPMTokenForNSS hasn't been called, return false. | 325 // If EnableTPMTokenForNSS hasn't been called, return false. |
246 if (!tpm_token_enabled_for_nss_) | 326 if (!tpm_token_enabled_for_nss_) |
247 return false; | 327 return false; |
248 | 328 |
249 // If everything is already initialized, then return true. | 329 // If everything is already initialized, then return true. |
250 if (chaps_module_ && tpm_slot_) | 330 if (chaps_module_ && tpm_slot_) |
251 return true; | 331 return true; |
(...skipping 16 matching lines...) Expand all Loading... |
268 if (!chaps_module_ && test_slot_) { | 348 if (!chaps_module_ && test_slot_) { |
269 // chromeos_unittests try to test the TPM initialization process. If we | 349 // chromeos_unittests try to test the TPM initialization process. If we |
270 // have a test DB open, pretend that it is the TPM slot. | 350 // have a test DB open, pretend that it is the TPM slot. |
271 tpm_slot_ = PK11_ReferenceSlot(test_slot_); | 351 tpm_slot_ = PK11_ReferenceSlot(test_slot_); |
272 return true; | 352 return true; |
273 } | 353 } |
274 } | 354 } |
275 if (chaps_module_){ | 355 if (chaps_module_){ |
276 tpm_slot_ = GetTPMSlotForId(token_slot_id); | 356 tpm_slot_ = GetTPMSlotForId(token_slot_id); |
277 | 357 |
| 358 if (tpm_slot_) { |
| 359 for (TPMReadyCallbackList::iterator i = |
| 360 tpm_ready_callback_list_.begin(); |
| 361 i != tpm_ready_callback_list_.end(); |
| 362 ++i) { |
| 363 (*i).Run(); |
| 364 } |
| 365 tpm_ready_callback_list_.clear(); |
| 366 } |
| 367 |
278 return tpm_slot_ != NULL; | 368 return tpm_slot_ != NULL; |
279 } | 369 } |
280 return false; | 370 return false; |
281 } | 371 } |
282 | 372 |
283 void GetTPMTokenInfo(std::string* token_name, std::string* user_pin) { | 373 void GetTPMTokenInfo(std::string* token_name, std::string* user_pin) { |
284 if (!tpm_token_enabled_for_nss_) { | 374 if (!tpm_token_enabled_for_nss_) { |
285 LOG(ERROR) << "GetTPMTokenInfo called before TPM Token is ready."; | 375 LOG(ERROR) << "GetTPMTokenInfo called before TPM Token is ready."; |
286 return; | 376 return; |
287 } | 377 } |
288 if (token_name) | 378 if (token_name) |
289 *token_name = tpm_token_name_; | 379 *token_name = tpm_token_name_; |
290 if (user_pin) | 380 if (user_pin) |
291 *user_pin = tpm_user_pin_; | 381 *user_pin = tpm_user_pin_; |
292 } | 382 } |
293 | 383 |
294 bool IsTPMTokenReady() { | 384 bool IsTPMTokenReady() { |
295 return tpm_slot_ != NULL; | 385 return tpm_slot_ != NULL; |
296 } | 386 } |
297 | 387 |
| 388 void OnTPMReady(const base::Closure& callback) { |
| 389 if (IsTPMTokenReady()) |
| 390 callback.Run(); |
| 391 else |
| 392 tpm_ready_callback_list_.push_back(callback); |
| 393 } |
| 394 |
298 // Note that CK_SLOT_ID is an unsigned long, but cryptohome gives us the slot | 395 // Note that CK_SLOT_ID is an unsigned long, but cryptohome gives us the slot |
299 // id as an int. This should be safe since this is only used with chaps, which | 396 // id as an int. This should be safe since this is only used with chaps, which |
300 // we also control. | 397 // we also control. |
301 PK11SlotInfo* GetTPMSlotForId(CK_SLOT_ID slot_id) { | 398 PK11SlotInfo* GetTPMSlotForId(CK_SLOT_ID slot_id) { |
302 if (!chaps_module_) | 399 if (!chaps_module_) |
303 return NULL; | 400 return NULL; |
304 | 401 |
305 VLOG(1) << "Poking chaps module."; | 402 VLOG(1) << "Poking chaps module."; |
306 SECStatus rv = SECMOD_UpdateSlotList(chaps_module_); | 403 SECStatus rv = SECMOD_UpdateSlotList(chaps_module_); |
307 if (rv != SECSuccess) | 404 if (rv != SECSuccess) |
308 PLOG(ERROR) << "SECMOD_UpdateSlotList failed: " << PORT_GetError(); | 405 PLOG(ERROR) << "SECMOD_UpdateSlotList failed: " << PORT_GetError(); |
309 | 406 |
310 PK11SlotInfo* slot = SECMOD_LookupSlot(chaps_module_->moduleID, slot_id); | 407 PK11SlotInfo* slot = SECMOD_LookupSlot(chaps_module_->moduleID, slot_id); |
311 if (!slot) | 408 if (!slot) |
312 LOG(ERROR) << "TPM slot " << slot_id << " not found."; | 409 LOG(ERROR) << "TPM slot " << slot_id << " not found."; |
313 return slot; | 410 return slot; |
314 } | 411 } |
| 412 |
| 413 bool InitializeNSSForChromeOSUser( |
| 414 const std::string& email, |
| 415 const std::string& username_hash, |
| 416 bool is_primary_user, |
| 417 const base::FilePath& path) { |
| 418 if (chromeos_user_map_.find(username_hash) != chromeos_user_map_.end()) { |
| 419 // This user already exists in our mapping. |
| 420 VLOG(1) << username_hash << " already initialized."; |
| 421 return false; |
| 422 } |
| 423 ScopedPK11Slot public_slot; |
| 424 if (is_primary_user) { |
| 425 VLOG(1) << "Primary user, using GetPublicNSSKeySlot()"; |
| 426 public_slot.reset(GetPublicNSSKeySlot()); |
| 427 } else { |
| 428 VLOG(1) << "Opening NSS DB"; |
| 429 public_slot.reset(OpenPersistentNSSDBForPath(path)); |
| 430 } |
| 431 chromeos_user_map_[username_hash] = |
| 432 new ChromeOSUserData(public_slot.Pass(), is_primary_user); |
| 433 return true; |
| 434 } |
| 435 |
| 436 void InitializeTPMForChromeOSUser(const std::string& username_hash, |
| 437 CK_SLOT_ID slot_id) { |
| 438 DCHECK(chromeos_user_map_.find(username_hash) != chromeos_user_map_.end()); |
| 439 chromeos_user_map_[username_hash] |
| 440 ->SetPrivateSlot(ScopedPK11Slot(GetTPMSlotForId(slot_id))); |
| 441 } |
| 442 |
| 443 void InitializePrivateSoftwareSlotForChromeOSUser( |
| 444 const std::string& username_hash) { |
| 445 LOG(WARNING) << "using software private slot for " << username_hash; |
| 446 DCHECK(chromeos_user_map_.find(username_hash) != chromeos_user_map_.end()); |
| 447 chromeos_user_map_[username_hash]->SetPrivateSlot( |
| 448 chromeos_user_map_[username_hash]->GetPublicSlot()); |
| 449 } |
| 450 |
| 451 ScopedPK11Slot GetPublicSlotForChromeOSUser( |
| 452 const std::string& username_hash) { |
| 453 if (test_slot_) { |
| 454 VLOG(1) << "returning test_slot_ for " << username_hash; |
| 455 return ScopedPK11Slot(PK11_ReferenceSlot(test_slot_)); |
| 456 } |
| 457 |
| 458 if (chromeos_user_map_.find(username_hash) == chromeos_user_map_.end()) { |
| 459 LOG(ERROR) << username_hash << " not initialized."; |
| 460 return ScopedPK11Slot(); |
| 461 } |
| 462 return chromeos_user_map_[username_hash]->GetPublicSlot(); |
| 463 } |
| 464 |
| 465 void OnPrivateSlotReadyForChromeOSUser( |
| 466 const std::string& username_hash, |
| 467 const base::Callback<void(ScopedPK11Slot)>& callback) { |
| 468 if (test_slot_) { |
| 469 VLOG(1) << "returning test_slot_ for " << username_hash; |
| 470 callback.Run(ScopedPK11Slot(PK11_ReferenceSlot(test_slot_))); |
| 471 return; |
| 472 } |
| 473 |
| 474 if (chromeos_user_map_.find(username_hash) == chromeos_user_map_.end()) { |
| 475 LOG(ERROR) << username_hash << " not initialized."; |
| 476 callback.Run(ScopedPK11Slot()); |
| 477 return; |
| 478 } |
| 479 chromeos_user_map_[username_hash]->OnPrivateSlotReady(callback); |
| 480 } |
315 #endif // defined(OS_CHROMEOS) | 481 #endif // defined(OS_CHROMEOS) |
316 | 482 |
317 | 483 |
318 bool OpenTestNSSDB() { | 484 bool OpenTestNSSDB() { |
319 if (test_slot_) | 485 if (test_slot_) |
320 return true; | 486 return true; |
321 if (!g_test_nss_db_dir.Get().CreateUniqueTempDir()) | 487 if (!g_test_nss_db_dir.Get().CreateUniqueTempDir()) |
322 return false; | 488 return false; |
323 test_slot_ = OpenUserDB(g_test_nss_db_dir.Get().path(), kTestTPMTokenName); | 489 test_slot_ = OpenUserDB(g_test_nss_db_dir.Get().path(), kTestTPMTokenName); |
324 return !!test_slot_; | 490 return !!test_slot_; |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 base::TimeTicks::Now() - start_time, | 652 base::TimeTicks::Now() - start_time, |
487 base::TimeDelta::FromMilliseconds(10), | 653 base::TimeDelta::FromMilliseconds(10), |
488 base::TimeDelta::FromHours(1), | 654 base::TimeDelta::FromHours(1), |
489 50); | 655 50); |
490 } | 656 } |
491 | 657 |
492 // NOTE(willchan): We don't actually execute this code since we leak NSS to | 658 // NOTE(willchan): We don't actually execute this code since we leak NSS to |
493 // prevent non-joinable threads from using NSS after it's already been shut | 659 // prevent non-joinable threads from using NSS after it's already been shut |
494 // down. | 660 // down. |
495 ~NSSInitSingleton() { | 661 ~NSSInitSingleton() { |
| 662 #if defined(OS_CHROMEOS) |
| 663 STLDeleteValues(&chromeos_user_map_); |
| 664 #endif |
496 if (tpm_slot_) { | 665 if (tpm_slot_) { |
497 PK11_FreeSlot(tpm_slot_); | 666 PK11_FreeSlot(tpm_slot_); |
498 tpm_slot_ = NULL; | 667 tpm_slot_ = NULL; |
499 } | 668 } |
500 if (software_slot_) { | 669 if (software_slot_) { |
501 SECMOD_CloseUserDB(software_slot_); | 670 SECMOD_CloseUserDB(software_slot_); |
502 PK11_FreeSlot(software_slot_); | 671 PK11_FreeSlot(software_slot_); |
503 software_slot_ = NULL; | 672 software_slot_ = NULL; |
504 } | 673 } |
505 CloseTestNSSDB(); | 674 CloseTestNSSDB(); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 } | 749 } |
581 return db_slot; | 750 return db_slot; |
582 } | 751 } |
583 | 752 |
584 // If this is set to true NSS is forced to be initialized without a DB. | 753 // If this is set to true NSS is forced to be initialized without a DB. |
585 static bool force_nodb_init_; | 754 static bool force_nodb_init_; |
586 | 755 |
587 bool tpm_token_enabled_for_nss_; | 756 bool tpm_token_enabled_for_nss_; |
588 std::string tpm_token_name_; | 757 std::string tpm_token_name_; |
589 std::string tpm_user_pin_; | 758 std::string tpm_user_pin_; |
| 759 typedef std::vector<base::Closure> TPMReadyCallbackList; |
| 760 TPMReadyCallbackList tpm_ready_callback_list_; |
590 SECMODModule* chaps_module_; | 761 SECMODModule* chaps_module_; |
591 PK11SlotInfo* software_slot_; | 762 PK11SlotInfo* software_slot_; |
592 PK11SlotInfo* test_slot_; | 763 PK11SlotInfo* test_slot_; |
593 PK11SlotInfo* tpm_slot_; | 764 PK11SlotInfo* tpm_slot_; |
594 SECMODModule* root_; | 765 SECMODModule* root_; |
595 bool chromeos_user_logged_in_; | 766 bool chromeos_user_logged_in_; |
| 767 #if defined(OS_CHROMEOS) |
| 768 typedef std::map<std::string, ChromeOSUserData*> ChromeOSUserMap; |
| 769 ChromeOSUserMap chromeos_user_map_; |
| 770 #endif |
596 #if defined(USE_NSS) | 771 #if defined(USE_NSS) |
597 // TODO(davidben): When https://bugzilla.mozilla.org/show_bug.cgi?id=564011 | 772 // TODO(davidben): When https://bugzilla.mozilla.org/show_bug.cgi?id=564011 |
598 // is fixed, we will no longer need the lock. | 773 // is fixed, we will no longer need the lock. |
599 base::Lock write_lock_; | 774 base::Lock write_lock_; |
600 #endif // defined(USE_NSS) | 775 #endif // defined(USE_NSS) |
601 }; | 776 }; |
602 | 777 |
603 // static | 778 // static |
604 bool NSSInitSingleton::force_nodb_init_ = false; | 779 bool NSSInitSingleton::force_nodb_init_ = false; |
605 | 780 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 | 922 |
748 #if defined(OS_CHROMEOS) | 923 #if defined(OS_CHROMEOS) |
749 void OpenPersistentNSSDB() { | 924 void OpenPersistentNSSDB() { |
750 g_nss_singleton.Get().OpenPersistentNSSDB(); | 925 g_nss_singleton.Get().OpenPersistentNSSDB(); |
751 } | 926 } |
752 | 927 |
753 void EnableTPMTokenForNSS() { | 928 void EnableTPMTokenForNSS() { |
754 g_nss_singleton.Get().EnableTPMTokenForNSS(); | 929 g_nss_singleton.Get().EnableTPMTokenForNSS(); |
755 } | 930 } |
756 | 931 |
| 932 bool IsTPMTokenEnabledForNSS() { |
| 933 return g_nss_singleton.Get().IsTPMTokenEnabledForNSS(); |
| 934 } |
| 935 |
757 void GetTPMTokenInfo(std::string* token_name, std::string* user_pin) { | 936 void GetTPMTokenInfo(std::string* token_name, std::string* user_pin) { |
758 g_nss_singleton.Get().GetTPMTokenInfo(token_name, user_pin); | 937 g_nss_singleton.Get().GetTPMTokenInfo(token_name, user_pin); |
759 } | 938 } |
760 | 939 |
761 bool IsTPMTokenReady() { | 940 bool IsTPMTokenReady() { |
762 return g_nss_singleton.Get().IsTPMTokenReady(); | 941 return g_nss_singleton.Get().IsTPMTokenReady(); |
763 } | 942 } |
764 | 943 |
| 944 void OnTPMReady(const base::Closure& callback) { |
| 945 g_nss_singleton.Get().OnTPMReady(callback); |
| 946 } |
| 947 |
765 bool InitializeTPMToken(const std::string& token_name, | 948 bool InitializeTPMToken(const std::string& token_name, |
766 int token_slot_id, | 949 int token_slot_id, |
767 const std::string& user_pin) { | 950 const std::string& user_pin) { |
768 return g_nss_singleton.Get().InitializeTPMToken( | 951 return g_nss_singleton.Get().InitializeTPMToken( |
769 token_name, token_slot_id, user_pin); | 952 token_name, token_slot_id, user_pin); |
770 } | 953 } |
| 954 |
| 955 bool InitializeNSSForChromeOSUser( |
| 956 const std::string& email, |
| 957 const std::string& username_hash, |
| 958 bool is_primary_user, |
| 959 const base::FilePath& path) { |
| 960 return g_nss_singleton.Get().InitializeNSSForChromeOSUser( |
| 961 email, username_hash, is_primary_user, path); |
| 962 } |
| 963 void InitializeTPMForChromeOSUser( |
| 964 const std::string& username_hash, |
| 965 CK_SLOT_ID slot_id) { |
| 966 g_nss_singleton.Get().InitializeTPMForChromeOSUser(username_hash, slot_id); |
| 967 } |
| 968 void InitializePrivateSoftwareSlotForChromeOSUser( |
| 969 const std::string& username_hash) { |
| 970 g_nss_singleton.Get().InitializePrivateSoftwareSlotForChromeOSUser( |
| 971 username_hash); |
| 972 } |
| 973 ScopedPK11Slot GetPublicSlotForChromeOSUser(const std::string& username_hash) { |
| 974 return g_nss_singleton.Get().GetPublicSlotForChromeOSUser(username_hash); |
| 975 } |
| 976 void OnPrivateSlotReadyForChromeOSUser( |
| 977 const std::string& username_hash, |
| 978 const base::Callback<void(ScopedPK11Slot)>& callback) { |
| 979 g_nss_singleton.Get().OnPrivateSlotReadyForChromeOSUser(username_hash, |
| 980 callback); |
| 981 } |
771 #endif // defined(OS_CHROMEOS) | 982 #endif // defined(OS_CHROMEOS) |
772 | 983 |
773 base::Time PRTimeToBaseTime(PRTime prtime) { | 984 base::Time PRTimeToBaseTime(PRTime prtime) { |
774 return base::Time::FromInternalValue( | 985 return base::Time::FromInternalValue( |
775 prtime + base::Time::UnixEpoch().ToInternalValue()); | 986 prtime + base::Time::UnixEpoch().ToInternalValue()); |
776 } | 987 } |
777 | 988 |
778 PRTime BaseTimeToPRTime(base::Time time) { | 989 PRTime BaseTimeToPRTime(base::Time time) { |
779 return time.ToInternalValue() - base::Time::UnixEpoch().ToInternalValue(); | 990 return time.ToInternalValue() - base::Time::UnixEpoch().ToInternalValue(); |
780 } | 991 } |
781 | 992 |
782 PK11SlotInfo* GetPublicNSSKeySlot() { | 993 PK11SlotInfo* GetPublicNSSKeySlot() { |
783 return g_nss_singleton.Get().GetPublicNSSKeySlot(); | 994 return g_nss_singleton.Get().GetPublicNSSKeySlot(); |
784 } | 995 } |
785 | 996 |
786 PK11SlotInfo* GetPrivateNSSKeySlot() { | 997 PK11SlotInfo* GetPrivateNSSKeySlot() { |
787 return g_nss_singleton.Get().GetPrivateNSSKeySlot(); | 998 return g_nss_singleton.Get().GetPrivateNSSKeySlot(); |
788 } | 999 } |
789 | 1000 |
790 } // namespace crypto | 1001 } // namespace crypto |
OLD | NEW |