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

Side by Side Diff: firmware/lib/rollback_index.c

Issue 2937001: Replace TlclDefineSpace with SafeDefineSpace for extra paranoia. (Closed) Base URL: ssh://git@chromiumos-git/vboot_reference.git
Patch Set: reconstructing issue after inadvertently deleting the branch Created 10 years, 5 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
« no previous file with comments | « no previous file | firmware/version.c » ('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) 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 29 matching lines...) Expand all
40 static uint32_t SafeWrite(uint32_t index, uint8_t* data, uint32_t length) { 40 static uint32_t SafeWrite(uint32_t index, uint8_t* data, uint32_t length) {
41 uint32_t result = TlclWrite(index, data, length); 41 uint32_t result = TlclWrite(index, data, length);
42 if (result == TPM_E_MAXNVWRITES) { 42 if (result == TPM_E_MAXNVWRITES) {
43 RETURN_ON_FAILURE(TPMClearAndReenable()); 43 RETURN_ON_FAILURE(TPMClearAndReenable());
44 return TlclWrite(index, data, length); 44 return TlclWrite(index, data, length);
45 } else { 45 } else {
46 return result; 46 return result;
47 } 47 }
48 } 48 }
49 49
50 /* Similarly to SafeWrite(), this ensures we don't fail a DefineSpace because
51 * we hit the TPM write limit. This is even less likely to happen than with
52 * writes because we only define spaces once at initialization, but we'd rather
53 * be paranoid about this.
54 */
55 static uint32_t SafeDefineSpace(uint32_t index, uint32_t perm, uint32_t size) {
56 uint32_t result = TlclDefineSpace(index, perm, size);
57 if (result == TPM_E_MAXNVWRITES) {
58 RETURN_ON_FAILURE(TPMClearAndReenable());
59 return TlclDefineSpace(index, perm, size);
60 } else {
61 return result;
62 }
63 }
64
50 static uint32_t InitializeKernelVersionsSpaces(void) { 65 static uint32_t InitializeKernelVersionsSpaces(void) {
51 RETURN_ON_FAILURE(TlclDefineSpace(KERNEL_VERSIONS_NV_INDEX, 66 RETURN_ON_FAILURE(SafeDefineSpace(KERNEL_VERSIONS_NV_INDEX,
52 TPM_NV_PER_PPWRITE, KERNEL_SPACE_SIZE)); 67 TPM_NV_PER_PPWRITE, KERNEL_SPACE_SIZE));
53 RETURN_ON_FAILURE(SafeWrite(KERNEL_VERSIONS_NV_INDEX, KERNEL_SPACE_INIT_DATA, 68 RETURN_ON_FAILURE(SafeWrite(KERNEL_VERSIONS_NV_INDEX, KERNEL_SPACE_INIT_DATA,
54 KERNEL_SPACE_SIZE)); 69 KERNEL_SPACE_SIZE));
55 return TPM_SUCCESS; 70 return TPM_SUCCESS;
56 } 71 }
57 72
58 /* When the return value is TPM_SUCCESS, this function sets *|initialized| to 1 73 /* When the return value is TPM_SUCCESS, this function sets *|initialized| to 1
59 * if the spaces have been fully initialized, to 0 if not. Otherwise 74 * if the spaces have been fully initialized, to 0 if not. Otherwise
60 * *|initialized| is not changed. 75 * *|initialized| is not changed.
61 */ 76 */
(...skipping 17 matching lines...) Expand all
79 /* Creates the NVRAM spaces, and sets their initial values as needed. 94 /* Creates the NVRAM spaces, and sets their initial values as needed.
80 */ 95 */
81 static uint32_t InitializeSpaces(void) { 96 static uint32_t InitializeSpaces(void) {
82 uint32_t zero = 0; 97 uint32_t zero = 0;
83 uint32_t firmware_perm = TPM_NV_PER_GLOBALLOCK | TPM_NV_PER_PPWRITE; 98 uint32_t firmware_perm = TPM_NV_PER_GLOBALLOCK | TPM_NV_PER_PPWRITE;
84 99
85 VBDEBUG(("Initializing spaces\n")); 100 VBDEBUG(("Initializing spaces\n"));
86 101
87 RETURN_ON_FAILURE(TlclSetNvLocked()); 102 RETURN_ON_FAILURE(TlclSetNvLocked());
88 103
89 RETURN_ON_FAILURE(TlclDefineSpace(FIRMWARE_VERSIONS_NV_INDEX, 104 RETURN_ON_FAILURE(SafeDefineSpace(FIRMWARE_VERSIONS_NV_INDEX,
90 firmware_perm, sizeof(uint32_t))); 105 firmware_perm, sizeof(uint32_t)));
91 RETURN_ON_FAILURE(SafeWrite(FIRMWARE_VERSIONS_NV_INDEX, 106 RETURN_ON_FAILURE(SafeWrite(FIRMWARE_VERSIONS_NV_INDEX,
92 (uint8_t*) &zero, sizeof(uint32_t))); 107 (uint8_t*) &zero, sizeof(uint32_t)));
93 108
94 RETURN_ON_FAILURE(InitializeKernelVersionsSpaces()); 109 RETURN_ON_FAILURE(InitializeKernelVersionsSpaces());
95 110
96 /* The space KERNEL_VERSIONS_BACKUP_NV_INDEX is used to protect the kernel 111 /* The space KERNEL_VERSIONS_BACKUP_NV_INDEX is used to protect the kernel
97 * versions. The content of space KERNEL_MUST_USE_BACKUP determines whether 112 * versions. The content of space KERNEL_MUST_USE_BACKUP determines whether
98 * only the backup value should be trusted. 113 * only the backup value should be trusted.
99 */ 114 */
100 RETURN_ON_FAILURE(TlclDefineSpace(KERNEL_VERSIONS_BACKUP_NV_INDEX, 115 RETURN_ON_FAILURE(SafeDefineSpace(KERNEL_VERSIONS_BACKUP_NV_INDEX,
101 firmware_perm, sizeof(uint32_t))); 116 firmware_perm, sizeof(uint32_t)));
102 RETURN_ON_FAILURE(SafeWrite(KERNEL_VERSIONS_BACKUP_NV_INDEX, 117 RETURN_ON_FAILURE(SafeWrite(KERNEL_VERSIONS_BACKUP_NV_INDEX,
103 (uint8_t*) &zero, sizeof(uint32_t))); 118 (uint8_t*) &zero, sizeof(uint32_t)));
104 RETURN_ON_FAILURE(TlclDefineSpace(KERNEL_MUST_USE_BACKUP_NV_INDEX, 119 RETURN_ON_FAILURE(SafeDefineSpace(KERNEL_MUST_USE_BACKUP_NV_INDEX,
105 firmware_perm, sizeof(uint32_t))); 120 firmware_perm, sizeof(uint32_t)));
106 RETURN_ON_FAILURE(SafeWrite(KERNEL_MUST_USE_BACKUP_NV_INDEX, 121 RETURN_ON_FAILURE(SafeWrite(KERNEL_MUST_USE_BACKUP_NV_INDEX,
107 (uint8_t*) &zero, sizeof(uint32_t))); 122 (uint8_t*) &zero, sizeof(uint32_t)));
108 RETURN_ON_FAILURE(TlclDefineSpace(DEVELOPER_MODE_NV_INDEX, 123 RETURN_ON_FAILURE(SafeDefineSpace(DEVELOPER_MODE_NV_INDEX,
109 firmware_perm, sizeof(uint32_t))); 124 firmware_perm, sizeof(uint32_t)));
110 RETURN_ON_FAILURE(SafeWrite(DEVELOPER_MODE_NV_INDEX, 125 RETURN_ON_FAILURE(SafeWrite(DEVELOPER_MODE_NV_INDEX,
111 (uint8_t*) &zero, sizeof(uint32_t))); 126 (uint8_t*) &zero, sizeof(uint32_t)));
112 127
113 /* The space TPM_IS_INITIALIZED_NV_INDEX is used to indicate that the TPM 128 /* The space TPM_IS_INITIALIZED_NV_INDEX is used to indicate that the TPM
114 * initialization has completed. Without it we cannot be sure that the last 129 * initialization has completed. Without it we cannot be sure that the last
115 * space to be created was also initialized (power could have been lost right 130 * space to be created was also initialized (power could have been lost right
116 * after its creation). 131 * after its creation).
117 */ 132 */
118 RETURN_ON_FAILURE(TlclDefineSpace(TPM_IS_INITIALIZED_NV_INDEX, 133 RETURN_ON_FAILURE(SafeDefineSpace(TPM_IS_INITIALIZED_NV_INDEX,
119 firmware_perm, sizeof(uint32_t))); 134 firmware_perm, sizeof(uint32_t)));
120 return TPM_SUCCESS; 135 return TPM_SUCCESS;
121 } 136 }
122 137
123 static uint32_t SetDistrustKernelSpaceAtNextBoot(uint32_t distrust) { 138 static uint32_t SetDistrustKernelSpaceAtNextBoot(uint32_t distrust) {
124 uint32_t must_use_backup; 139 uint32_t must_use_backup;
125 RETURN_ON_FAILURE(TlclRead(KERNEL_MUST_USE_BACKUP_NV_INDEX, 140 RETURN_ON_FAILURE(TlclRead(KERNEL_MUST_USE_BACKUP_NV_INDEX,
126 (uint8_t*) &must_use_backup, sizeof(uint32_t))); 141 (uint8_t*) &must_use_backup, sizeof(uint32_t)));
127 if (must_use_backup != distrust) { 142 if (must_use_backup != distrust) {
128 RETURN_ON_FAILURE(SafeWrite(KERNEL_MUST_USE_BACKUP_NV_INDEX, 143 RETURN_ON_FAILURE(SafeWrite(KERNEL_MUST_USE_BACKUP_NV_INDEX,
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 return TPM_SUCCESS; 358 return TPM_SUCCESS;
344 } 359 }
345 360
346 uint32_t RollbackKernelLock(void) { 361 uint32_t RollbackKernelLock(void) {
347 if (!g_rollback_recovery_mode) { 362 if (!g_rollback_recovery_mode) {
348 return TlclLockPhysicalPresence(); 363 return TlclLockPhysicalPresence();
349 } else { 364 } else {
350 return TPM_SUCCESS; 365 return TPM_SUCCESS;
351 } 366 }
352 } 367 }
OLDNEW
« no previous file with comments | « no previous file | firmware/version.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698