| Index: tpm.cc
|
| diff --git a/tpm.cc b/tpm.cc
|
| index bc2f3da0807355609000e179206e3e7c29847641..1cea680010414a45401cb6bcb729fde2c0aef943 100644
|
| --- a/tpm.cc
|
| +++ b/tpm.cc
|
| @@ -26,6 +26,8 @@ const unsigned char kDefaultSrkAuth[] = { };
|
| const int kDefaultTpmRsaKeyBits = 2048;
|
| const int kDefaultDiscardableWrapPasswordLength = 32;
|
| const char kDefaultCryptohomeKeyFile[] = "/home/.shadow/cryptohome.key";
|
| +const TSS_UUID kCryptohomeWellKnownUuid = {0x0203040b, 0, 0, 0, 0,
|
| + {0, 9, 8, 1, 0, 3}};
|
|
|
| Tpm::Tpm()
|
| : rsa_key_bits_(kDefaultTpmRsaKeyBits),
|
| @@ -120,6 +122,22 @@ bool Tpm::LoadOrCreateCryptohomeKey(TSS_HCONTEXT context_handle,
|
| }
|
| }
|
|
|
| + // Then try loading the key by the UUID (this is a legacy upgrade path)
|
| + if ((result = Tspi_Context_LoadKeyByUUID(context_handle,
|
| + TSS_PS_TYPE_SYSTEM,
|
| + kCryptohomeWellKnownUuid,
|
| + key_handle)) == TSS_SUCCESS) {
|
| + Tspi_Context_CloseObject(context_handle, srk_handle);
|
| + // Save the cryptohome key to the well-known location
|
| + if (register_key) {
|
| + if (!SaveCryptohomeKey(context_handle, *key_handle)) {
|
| + LOG(ERROR) << "Couldn't save cryptohome key";
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| + }
|
| +
|
| // Otherwise, we need to create the key. First, create an object.
|
| TSS_FLAG init_flags = TSS_KEY_TYPE_LEGACY | TSS_KEY_VOLATILE;
|
| if (!create_in_tpm) {
|
| @@ -256,22 +274,8 @@ bool Tpm::LoadOrCreateCryptohomeKey(TSS_HCONTEXT context_handle,
|
| }
|
|
|
| if (register_key) {
|
| - SecureBlob raw_key;
|
| - if (!GetKeyBlob(context_handle, local_key_handle, &raw_key)) {
|
| - LOG(ERROR) << "Error getting key blob";
|
| - Tspi_Context_CloseObject(context_handle, srk_handle);
|
| - Tspi_Context_CloseObject(context_handle, local_key_handle);
|
| - return false;
|
| - }
|
| - Platform platform;
|
| - int previous_mask = platform.SetMask(cryptohome::kDefaultUmask);
|
| - unsigned int data_written = file_util::WriteFile(
|
| - FilePath(key_file_),
|
| - static_cast<const char*>(raw_key.const_data()),
|
| - raw_key.size());
|
| - platform.SetMask(previous_mask);
|
| - if (data_written != raw_key.size()) {
|
| - LOG(ERROR) << "Error writing key file";
|
| + if (!SaveCryptohomeKey(context_handle, local_key_handle)) {
|
| + LOG(ERROR) << "Couldn't save cryptohome key";
|
| Tspi_Context_CloseObject(context_handle, srk_handle);
|
| Tspi_Context_CloseObject(context_handle, local_key_handle);
|
| return false;
|
| @@ -291,6 +295,27 @@ bool Tpm::LoadOrCreateCryptohomeKey(TSS_HCONTEXT context_handle,
|
| return true;
|
| }
|
|
|
| +bool Tpm::SaveCryptohomeKey(TSS_HCONTEXT context_handle,
|
| + TSS_HKEY key_handle) const {
|
| + SecureBlob raw_key;
|
| + if (!GetKeyBlob(context_handle, key_handle, &raw_key)) {
|
| + LOG(ERROR) << "Error getting key blob";
|
| + return false;
|
| + }
|
| + Platform platform;
|
| + int previous_mask = platform.SetMask(cryptohome::kDefaultUmask);
|
| + unsigned int data_written = file_util::WriteFile(
|
| + FilePath(key_file_),
|
| + static_cast<const char*>(raw_key.const_data()),
|
| + raw_key.size());
|
| + platform.SetMask(previous_mask);
|
| + if (data_written != raw_key.size()) {
|
| + LOG(ERROR) << "Error writing key file";
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| int Tpm::GetMaxRsaKeyCount() const {
|
| if (context_handle_ == 0) {
|
| return -1;
|
|
|