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

Side by Side Diff: tpm.cc

Issue 3236009: Add additional status APIs for the TPM. (Closed) Base URL: http://git.chromium.org/git/tpm_init.git
Patch Set: Created 10 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 | Annotate | Revision Log
« no previous file with comments | « tpm.h ('k') | tpm_init.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved. 1 // Copyright (c) 2009-2010 The Chromium OS 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 // Contains the implementation of class Tpm 5 // Contains the implementation of class Tpm
6 6
7 #include "tpm.h" 7 #include "tpm.h"
8 8
9 #include <base/file_util.h> 9 #include <base/file_util.h>
10 #include <base/platform_thread.h> 10 #include <base/platform_thread.h>
(...skipping 16 matching lines...) Expand all
27 const char kTpmWellKnownPassword[] = TSS_WELL_KNOWN_SECRET; 27 const char kTpmWellKnownPassword[] = TSS_WELL_KNOWN_SECRET;
28 28
29 Tpm::Tpm() 29 Tpm::Tpm()
30 : context_handle_(0), 30 : context_handle_(0),
31 default_crypto_(new Crypto()), 31 default_crypto_(new Crypto()),
32 crypto_(default_crypto_.get()), 32 crypto_(default_crypto_.get()),
33 owner_password_(), 33 owner_password_(),
34 password_sync_lock_(), 34 password_sync_lock_(),
35 is_disabled_(true), 35 is_disabled_(true),
36 is_owned_(false), 36 is_owned_(false),
37 is_srk_available_(false) { 37 is_srk_available_(false),
38 is_being_owned_(false) {
38 } 39 }
39 40
40 Tpm::~Tpm() { 41 Tpm::~Tpm() {
41 Disconnect(); 42 Disconnect();
42 } 43 }
43 44
44 bool Tpm::Init() { 45 bool Tpm::Init() {
45 // Checking disabled and owned either via sysfs or via TSS calls will block if 46 // Checking disabled and owned either via sysfs or via TSS calls will block if
46 // ownership is being taken by another thread or process. So for this to work 47 // ownership is being taken by another thread or process. So for this to work
47 // well, Tpm::Init() needs to be called before InitializeTpm() is called. At 48 // well, Tpm::Init() needs to be called before InitializeTpm() is called. At
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
508 if (is_disabled_) { 509 if (is_disabled_) {
509 return false; 510 return false;
510 } 511 }
511 512
512 SecureBlob default_owner_password(sizeof(kTpmWellKnownPassword)); 513 SecureBlob default_owner_password(sizeof(kTpmWellKnownPassword));
513 memcpy(default_owner_password.data(), kTpmWellKnownPassword, 514 memcpy(default_owner_password.data(), kTpmWellKnownPassword,
514 sizeof(kTpmWellKnownPassword)); 515 sizeof(kTpmWellKnownPassword));
515 516
516 bool took_ownership = false; 517 bool took_ownership = false;
517 if (!is_owned_) { 518 if (!is_owned_) {
519 is_being_owned_ = true;
518 file_util::Delete(FilePath(kOpenCryptokiPath), true); 520 file_util::Delete(FilePath(kOpenCryptokiPath), true);
519 file_util::Delete(FilePath(kTpmOwnedFile), false); 521 file_util::Delete(FilePath(kTpmOwnedFile), false);
520 522
521 if (!IsEndorsementKeyAvailable(context_handle_)) { 523 if (!IsEndorsementKeyAvailable(context_handle_)) {
522 if (!CreateEndorsementKey(context_handle_)) { 524 if (!CreateEndorsementKey(context_handle_)) {
523 LOG(ERROR) << "Failed to create endorsement key"; 525 LOG(ERROR) << "Failed to create endorsement key";
526 is_being_owned_ = false;
524 return false; 527 return false;
525 } 528 }
526 } 529 }
527 530
528 if (!IsEndorsementKeyAvailable(context_handle_)) { 531 if (!IsEndorsementKeyAvailable(context_handle_)) {
529 LOG(ERROR) << "Endorsement key is not available"; 532 LOG(ERROR) << "Endorsement key is not available";
533 is_being_owned_ = false;
530 return false; 534 return false;
531 } 535 }
532 536
533 if (!TakeOwnership(context_handle_, kMaxTimeoutRetries, 537 if (!TakeOwnership(context_handle_, kMaxTimeoutRetries,
534 default_owner_password)) { 538 default_owner_password)) {
535 LOG(ERROR) << "Take Ownership failed"; 539 LOG(ERROR) << "Take Ownership failed";
540 is_being_owned_ = false;
536 return false; 541 return false;
537 } 542 }
538 543
539 is_owned_ = true; 544 is_owned_ = true;
540 took_ownership = true; 545 took_ownership = true;
541 } 546 }
542 547
543 // Ensure the SRK is available 548 // Ensure the SRK is available
544 TSS_RESULT result; 549 TSS_RESULT result;
545 TSS_HKEY srk_handle; 550 TSS_HKEY srk_handle;
546 TSS_UUID SRK_UUID = TSS_UUID_SRK; 551 TSS_UUID SRK_UUID = TSS_UUID_SRK;
547 if ((result = Tspi_Context_LoadKeyByUUID(context_handle_, TSS_PS_TYPE_SYSTEM, 552 if ((result = Tspi_Context_LoadKeyByUUID(context_handle_, TSS_PS_TYPE_SYSTEM,
548 SRK_UUID, &srk_handle))) { 553 SRK_UUID, &srk_handle))) {
549 is_srk_available_ = false; 554 is_srk_available_ = false;
550 } else { 555 } else {
551 Tspi_Context_CloseObject(context_handle_, srk_handle); 556 Tspi_Context_CloseObject(context_handle_, srk_handle);
552 is_srk_available_ = true; 557 is_srk_available_ = true;
553 } 558 }
554 559
555 // If we can open the TPM with the default password, then we still need to 560 // If we can open the TPM with the default password, then we still need to
556 // zero the SRK password and unrestrict it, then change the owner password. 561 // zero the SRK password and unrestrict it, then change the owner password.
557 TSS_HTPM tpm_handle; 562 TSS_HTPM tpm_handle;
558 if (GetTpmWithAuth(context_handle_, default_owner_password, &tpm_handle) && 563 if (GetTpmWithAuth(context_handle_, default_owner_password, &tpm_handle) &&
559 TestTpmAuth(tpm_handle)) { 564 TestTpmAuth(tpm_handle)) {
560 if (!ZeroSrkPassword(context_handle_, default_owner_password)) { 565 if (!ZeroSrkPassword(context_handle_, default_owner_password)) {
561 LOG(ERROR) << "Couldn't zero SRK password"; 566 LOG(ERROR) << "Couldn't zero SRK password";
567 is_being_owned_ = false;
562 return false; 568 return false;
563 } 569 }
564 570
565 if (!UnrestrictSrk(context_handle_, default_owner_password)) { 571 if (!UnrestrictSrk(context_handle_, default_owner_password)) {
566 LOG(ERROR) << "Couldn't unrestrict the SRK"; 572 LOG(ERROR) << "Couldn't unrestrict the SRK";
573 is_being_owned_ = false;
567 return false; 574 return false;
568 } 575 }
569 SecureBlob owner_password; 576 SecureBlob owner_password;
570 CreateOwnerPassword(&owner_password); 577 CreateOwnerPassword(&owner_password);
571 578
572 if (!ChangeOwnerPassword(context_handle_, default_owner_password, 579 if (!ChangeOwnerPassword(context_handle_, default_owner_password,
573 owner_password)) { 580 owner_password)) {
574 LOG(ERROR) << "Couldn't set the owner password"; 581 LOG(ERROR) << "Couldn't set the owner password";
582 is_being_owned_ = false;
575 return false; 583 return false;
576 } 584 }
577 585
578 password_sync_lock_.Acquire(); 586 password_sync_lock_.Acquire();
579 owner_password_.assign(owner_password.begin(), owner_password.end()); 587 owner_password_.assign(owner_password.begin(), owner_password.end());
580 password_sync_lock_.Release(); 588 password_sync_lock_.Release();
581 589
582 file_util::WriteFile(FilePath(kTpmOwnedFile), NULL, 0); 590 file_util::WriteFile(FilePath(kTpmOwnedFile), NULL, 0);
583 } 591 }
584 592
585 return took_ownership; 593 is_being_owned_ = false;
594
595 return took_ownership;
586 } 596 }
587 597
588 bool Tpm::GetRandomData(size_t length, chromeos::Blob* data) { 598 bool Tpm::GetRandomData(size_t length, chromeos::Blob* data) {
589 TSS_HCONTEXT context_handle; 599 TSS_HCONTEXT context_handle;
590 if (!OpenAndConnectTpm(&context_handle)) { 600 if (!OpenAndConnectTpm(&context_handle)) {
591 LOG(ERROR) << "Could not open the TPM"; 601 LOG(ERROR) << "Could not open the TPM";
592 return false; 602 return false;
593 } 603 }
594 604
595 TSS_HTPM tpm_handle; 605 TSS_HTPM tpm_handle;
(...skipping 13 matching lines...) Expand all
609 } 619 }
610 memcpy(random.data(), tpm_data, random.size()); 620 memcpy(random.data(), tpm_data, random.size());
611 Tspi_Context_FreeMemory(context_handle, tpm_data); 621 Tspi_Context_FreeMemory(context_handle, tpm_data);
612 chromeos::SecureMemset(tpm_data, 0, random.size()); 622 chromeos::SecureMemset(tpm_data, 0, random.size());
613 Tspi_Context_Close(context_handle); 623 Tspi_Context_Close(context_handle);
614 data->swap(random); 624 data->swap(random);
615 return true; 625 return true;
616 } 626 }
617 627
618 } // namespace tpm_init 628 } // namespace tpm_init
OLDNEW
« no previous file with comments | « tpm.h ('k') | tpm_init.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698