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

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

Issue 3367020: use continue self test (Closed) Base URL: http://git.chromium.org/git/vboot_reference.git
Patch Set: Use continue self test everywhere 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 | « 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
11 #include "tlcl.h" 11 #include "tlcl.h"
12 #include "tss_constants.h" 12 #include "tss_constants.h"
13 #include "utility.h" 13 #include "utility.h"
14 14
15
16 /* TPM PCR to use for storing dev mode measurements */ 15 /* TPM PCR to use for storing dev mode measurements */
17 #define DEV_MODE_PCR 0 16 #define DEV_MODE_PCR 0
18 /* Input digests for PCR extend */ 17 /* Input digests for PCR extend */
19 #define DEV_MODE_ON_SHA1_DIGEST ((uint8_t*) "\xbf\x8b\x45\x30\xd8\xd2\x46\xdd" \ 18 #define DEV_MODE_ON_SHA1_DIGEST ((uint8_t*) "\xbf\x8b\x45\x30\xd8\xd2\x46\xdd" \
20 "\x74\xac\x53\xa1\x34\x71\xbb\xa1\x79\x41" \ 19 "\x74\xac\x53\xa1\x34\x71\xbb\xa1\x79\x41" \
21 "\xdf\xf7") /* SHA1("\x01") */ 20 "\xdf\xf7") /* SHA1("\x01") */
22 #define DEV_MODE_OFF_SHA1_DIGEST ((uint8_t*) "\x5b\xa9\x3c\x9d\xb0\xcf\xf9\x3f"\ 21 #define DEV_MODE_OFF_SHA1_DIGEST ((uint8_t*) "\x5b\xa9\x3c\x9d\xb0\xcf\xf9\x3f"\
23 "\x52\xb5\x21\xd7\x42\x0e\x43\xf6\xed\xa2" \ 22 "\x52\xb5\x21\xd7\x42\x0e\x43\xf6\xed\xa2" \
24 "\x78\x4f") /* SHA1("\x00") */ 23 "\x78\x4f") /* SHA1("\x00") */
25 24
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 uint8_t disable; 166 uint8_t disable;
168 uint8_t deactivated; 167 uint8_t deactivated;
169 uint32_t result; 168 uint32_t result;
170 169
171 VBDEBUG(("TPM: SetupTPM(r%d, d%d)\n", recovery_mode, developer_mode)); 170 VBDEBUG(("TPM: SetupTPM(r%d, d%d)\n", recovery_mode, developer_mode));
172 171
173 /* TODO: TlclLibInit() should be able to return failure */ 172 /* TODO: TlclLibInit() should be able to return failure */
174 TlclLibInit(); 173 TlclLibInit();
175 174
176 RETURN_ON_FAILURE(TlclStartup()); 175 RETURN_ON_FAILURE(TlclStartup());
177 #ifdef USE_CONTINUE_SELF_TEST 176 /* Use ContinueSelfTest rather than SelfTestFull(). It enables
178 /* TODO: ContinueSelfTest() should be faster than SelfTestFull, but 177 * access to the subset of TPM commands we need in the firmware, and
179 * may also not work properly in older TPM firmware. For now, do 178 * allows the full self test to run in paralle with firmware
180 * the full self test. */ 179 * startup. By the time we get to the OS, self test will have
180 * completed. */
181 RETURN_ON_FAILURE(TlclContinueSelfTest()); 181 RETURN_ON_FAILURE(TlclContinueSelfTest());
182 #else
183 RETURN_ON_FAILURE(TlclSelfTestFull());
184 #endif
185 result = TlclAssertPhysicalPresence(); 182 result = TlclAssertPhysicalPresence();
186 if (result != 0) { 183 if (result != 0) {
187 /* It is possible that the TPM was delivered with the physical presence 184 /* It is possible that the TPM was delivered with the physical presence
188 * command disabled. This tries enabling it, then tries asserting PP 185 * command disabled. This tries enabling it, then tries asserting PP
189 * again. 186 * again.
190 */ 187 */
191 RETURN_ON_FAILURE(TlclPhysicalPresenceCMDEnable()); 188 RETURN_ON_FAILURE(TlclPhysicalPresenceCMDEnable());
192 RETURN_ON_FAILURE(TlclAssertPhysicalPresence()); 189 RETURN_ON_FAILURE(TlclAssertPhysicalPresence());
193 } 190 }
194 191
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 #ifdef DISABLE_ROLLBACK_TPM 252 #ifdef DISABLE_ROLLBACK_TPM
256 253
257 /* Dummy implementations which don't support TPM rollback protection */ 254 /* Dummy implementations which don't support TPM rollback protection */
258 255
259 uint32_t RollbackS3Resume(void) { 256 uint32_t RollbackS3Resume(void) {
260 #ifndef CHROMEOS_ENVIRONMENT 257 #ifndef CHROMEOS_ENVIRONMENT
261 /* Initialize the TPM, but ignore return codes. In ChromeOS 258 /* Initialize the TPM, but ignore return codes. In ChromeOS
262 * environment, don't even talk to the TPM. */ 259 * environment, don't even talk to the TPM. */
263 TlclLibInit(); 260 TlclLibInit();
264 TlclResume(); 261 TlclResume();
265 TlclSelfTestFull(); 262 TlclContinueSelfTest();
266 #endif 263 #endif
267 return TPM_SUCCESS; 264 return TPM_SUCCESS;
268 } 265 }
269 266
270 uint32_t RollbackFirmwareSetup(int developer_mode, uint32_t* version) { 267 uint32_t RollbackFirmwareSetup(int developer_mode, uint32_t* version) {
271 #ifndef CHROMEOS_ENVIRONMENT 268 #ifndef CHROMEOS_ENVIRONMENT
272 /* Initializes the TPM, but ignores return codes. In ChromeOS 269 /* Initializes the TPM, but ignores return codes. In ChromeOS
273 * environment, doesn't even talk to the TPM. */ 270 * environment, doesn't even talk to the TPM. */
274 TlclLibInit(); 271 TlclLibInit();
275 TlclStartup(); 272 TlclStartup();
276 TlclSelfTestFull(); 273 TlclContinueSelfTest();
277 #endif 274 #endif
278 275
279 *version = 0; 276 *version = 0;
280 return TPM_SUCCESS; 277 return TPM_SUCCESS;
281 } 278 }
282 279
283 uint32_t RollbackFirmwareWrite(uint32_t version) { 280 uint32_t RollbackFirmwareWrite(uint32_t version) {
284 return TPM_SUCCESS; 281 return TPM_SUCCESS;
285 } 282 }
286 283
(...skipping 23 matching lines...) Expand all
310 307
311 uint32_t RollbackKernelLock(void) { 308 uint32_t RollbackKernelLock(void) {
312 return TPM_SUCCESS; 309 return TPM_SUCCESS;
313 } 310 }
314 311
315 #else 312 #else
316 313
317 uint32_t RollbackS3Resume(void) { 314 uint32_t RollbackS3Resume(void) {
318 uint32_t result; 315 uint32_t result;
319 TlclLibInit(); 316 TlclLibInit();
320 /* Check for INVALID_POSTINIT error, so we don't have to worry if this ends
321 * up in hardware that keeps the TPM powered on during S3.
322 */
323 result = TlclResume(); 317 result = TlclResume();
324 if (result == TPM_E_INVALID_POSTINIT) { 318 if (result == TPM_E_INVALID_POSTINIT) {
319 /* We're on a platform where the TPM maintains power in S3, so
320 it's already initialized. No need for a self-test. */
325 return TPM_SUCCESS; 321 return TPM_SUCCESS;
326 } 322 }
327 if (result != TPM_SUCCESS) { 323 if (result != TPM_SUCCESS) {
328 return result; 324 return result;
329 } 325 }
330 #ifdef USE_CONTINUE_SELF_TEST 326
331 /* TODO: ContinueSelfTest() should be faster than SelfTestFull, but
332 * may also not work properly in older TPM firmware. For now, do
333 * the full self test. */
334 RETURN_ON_FAILURE(TlclContinueSelfTest()); 327 RETURN_ON_FAILURE(TlclContinueSelfTest());
335 #else 328
336 RETURN_ON_FAILURE(TlclSelfTestFull());
337 #endif
338 return TPM_SUCCESS; 329 return TPM_SUCCESS;
339 } 330 }
340 331
341 332
342 uint32_t RollbackFirmwareSetup(int developer_mode, uint32_t* version) { 333 uint32_t RollbackFirmwareSetup(int developer_mode, uint32_t* version) {
343 RollbackSpaceFirmware rsf; 334 RollbackSpaceFirmware rsf;
344 uint8_t out_digest[20]; /* For PCR extend output */ 335 uint8_t out_digest[20]; /* For PCR extend output */
345 336
346 RETURN_ON_FAILURE(SetupTPM(0, developer_mode, &rsf)); 337 RETURN_ON_FAILURE(SetupTPM(0, developer_mode, &rsf));
347 *version = rsf.fw_versions; 338 *version = rsf.fw_versions;
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 417
427 uint32_t RollbackKernelLock(void) { 418 uint32_t RollbackKernelLock(void) {
428 if (g_rollback_recovery_mode) { 419 if (g_rollback_recovery_mode) {
429 return TPM_SUCCESS; 420 return TPM_SUCCESS;
430 } else { 421 } else {
431 return TlclLockPhysicalPresence(); 422 return TlclLockPhysicalPresence();
432 } 423 }
433 } 424 }
434 425
435 #endif // DISABLE_ROLLBACK_TPM 426 #endif // DISABLE_ROLLBACK_TPM
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