| OLD | NEW | 
|    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  Loading... | 
|   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  Loading... | 
|  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  Loading... | 
|  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 | 
| OLD | NEW |