OLD | NEW |
1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 /* Copyright (c) 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 * Functions for querying, manipulating and locking rollback indices | 5 * Functions for querying, manipulating and locking rollback indices |
6 * stored in the TPM NVRAM. | 6 * stored in the TPM NVRAM. |
7 */ | 7 */ |
8 | 8 |
9 #include "rollback_index.h" | 9 #include "rollback_index.h" |
10 | 10 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 /* Performs one-time initializations. Creates the NVRAM spaces, and sets their | 100 /* Performs one-time initializations. Creates the NVRAM spaces, and sets their |
101 * initial values as needed. Sets the nvLocked bit and ensures the physical | 101 * initial values as needed. Sets the nvLocked bit and ensures the physical |
102 * presence command is enabled and locked. | 102 * presence command is enabled and locked. |
103 */ | 103 */ |
104 static uint32_t OneTimeInitializeTPM(RollbackSpaceFirmware* rsf, | 104 static uint32_t OneTimeInitializeTPM(RollbackSpaceFirmware* rsf, |
105 RollbackSpaceKernel* rsk) { | 105 RollbackSpaceKernel* rsk) { |
106 static const RollbackSpaceFirmware rsf_init = { | 106 static const RollbackSpaceFirmware rsf_init = { |
107 ROLLBACK_SPACE_FIRMWARE_VERSION, 0, 0, 0}; | 107 ROLLBACK_SPACE_FIRMWARE_VERSION, 0, 0, 0}; |
108 static const RollbackSpaceKernel rsk_init = { | 108 static const RollbackSpaceKernel rsk_init = { |
109 ROLLBACK_SPACE_KERNEL_VERSION, ROLLBACK_SPACE_KERNEL_UID, 0, 0}; | 109 ROLLBACK_SPACE_KERNEL_VERSION, ROLLBACK_SPACE_KERNEL_UID, 0, 0}; |
110 uint8_t nvlocked = 0; | 110 TPM_PERMANENT_FLAGS pflags; |
| 111 uint32_t result; |
111 | 112 |
112 VBDEBUG(("TPM: One-time initialization\n")); | 113 VBDEBUG(("TPM: One-time initialization\n")); |
113 | 114 |
114 RETURN_ON_FAILURE(TlclFinalizePhysicalPresence()); | 115 result = TlclGetPermanentFlags(&pflags); |
| 116 if (result != TPM_SUCCESS) |
| 117 return result; |
| 118 |
| 119 /* TPM may come from the factory without physical presence finalized. Fix |
| 120 * if necessary. */ |
| 121 VBDEBUG(("TPM: physicalPresenceLifetimeLock=%d\n", |
| 122 pflags.physicalPresenceLifetimeLock)); |
| 123 if (!pflags.physicalPresenceLifetimeLock) { |
| 124 VBDEBUG(("TPM: Finalizing physical presence\n")); |
| 125 RETURN_ON_FAILURE(TlclFinalizePhysicalPresence()); |
| 126 } |
115 | 127 |
116 /* The TPM will not enforce the NV authorization restrictions until the | 128 /* The TPM will not enforce the NV authorization restrictions until the |
117 * execution of a TPM_NV_DefineSpace with the handle of TPM_NV_INDEX_LOCK. | 129 * execution of a TPM_NV_DefineSpace with the handle of TPM_NV_INDEX_LOCK. |
118 * Here we create that space if it doesn't already exist. */ | 130 * Here we create that space if it doesn't already exist. */ |
119 RETURN_ON_FAILURE(TlclGetFlags(NULL, NULL, &nvlocked)); | 131 VBDEBUG(("TPM: nvLocked=%d\n", pflags.nvLocked)); |
120 VBDEBUG(("TPM: nvlocked=%d\n", nvlocked)); | 132 if (!pflags.nvLocked) { |
121 if (!nvlocked) { | |
122 VBDEBUG(("TPM: Enabling NV locking\n")); | 133 VBDEBUG(("TPM: Enabling NV locking\n")); |
123 RETURN_ON_FAILURE(TlclSetNvLocked()); | 134 RETURN_ON_FAILURE(TlclSetNvLocked()); |
124 } | 135 } |
125 | 136 |
| 137 /* Clear TPM owner, in case the TPM is already owned for some reason. */ |
| 138 VBDEBUG(("TPM: Clearing owner\n")); |
| 139 RETURN_ON_FAILURE(TlclForceClear()); |
| 140 |
126 /* Initializes the firmware and kernel spaces */ | 141 /* Initializes the firmware and kernel spaces */ |
127 Memcpy(rsf, &rsf_init, sizeof(RollbackSpaceFirmware)); | 142 Memcpy(rsf, &rsf_init, sizeof(RollbackSpaceFirmware)); |
128 Memcpy(rsk, &rsk_init, sizeof(RollbackSpaceKernel)); | 143 Memcpy(rsk, &rsk_init, sizeof(RollbackSpaceKernel)); |
129 | 144 |
130 /* Defines and sets firmware and kernel spaces */ | 145 /* Defines and sets firmware and kernel spaces */ |
131 RETURN_ON_FAILURE(SafeDefineSpace(FIRMWARE_NV_INDEX, | 146 RETURN_ON_FAILURE(SafeDefineSpace(FIRMWARE_NV_INDEX, |
132 TPM_NV_PER_GLOBALLOCK | TPM_NV_PER_PPWRITE, | 147 TPM_NV_PER_GLOBALLOCK | TPM_NV_PER_PPWRITE, |
133 sizeof(RollbackSpaceFirmware))); | 148 sizeof(RollbackSpaceFirmware))); |
134 RETURN_ON_FAILURE(WriteSpaceFirmware(rsf)); | 149 RETURN_ON_FAILURE(WriteSpaceFirmware(rsf)); |
135 RETURN_ON_FAILURE(SafeDefineSpace(KERNEL_NV_INDEX, TPM_NV_PER_PPWRITE, | 150 RETURN_ON_FAILURE(SafeDefineSpace(KERNEL_NV_INDEX, TPM_NV_PER_PPWRITE, |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 | 432 |
418 uint32_t RollbackKernelLock(void) { | 433 uint32_t RollbackKernelLock(void) { |
419 if (g_rollback_recovery_mode) { | 434 if (g_rollback_recovery_mode) { |
420 return TPM_SUCCESS; | 435 return TPM_SUCCESS; |
421 } else { | 436 } else { |
422 return TlclLockPhysicalPresence(); | 437 return TlclLockPhysicalPresence(); |
423 } | 438 } |
424 } | 439 } |
425 | 440 |
426 #endif // DISABLE_ROLLBACK_TPM | 441 #endif // DISABLE_ROLLBACK_TPM |
OLD | NEW |