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

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

Issue 3973001: Change PCR extend call to capture the state of both recovery and dev modes (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/vboot_reference.git
Patch Set: return right error code Created 10 years, 2 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 /* TPM PCR to use for storing dev mode measurements */ 15 /* TPM PCR to use for storing dev mode measurements */
16 #define DEV_MODE_PCR 0 16 #define DEV_REC_MODE_PCR 0
17 /* Input digests for PCR extend */ 17 /* Input digests for PCR extend */
18 #define DEV_MODE_ON_SHA1_DIGEST ((uint8_t*) "\xbf\x8b\x45\x30\xd8\xd2\x46\xdd" \ 18 #define DEV_OFF_REC_OFF_SHA1_DIGEST ((uint8_t*) "\x14\x89\xf9\x23\xc4\xdc\xa7" \
19 "\x74\xac\x53\xa1\x34\x71\xbb\xa1\x79\x41" \ 19 "\x29\x17\x8b\x3e\x32\x33\x45\x85\x50" \
20 "\xdf\xf7") /* SHA1("\x01") */ 20 "\xd8\xdd\xdf\x29") /* SHA1("\x00\x00") */
21 #define DEV_MODE_OFF_SHA1_DIGEST ((uint8_t*) "\x5b\xa9\x3c\x9d\xb0\xcf\xf9\x3f"\ 21
22 "\x52\xb5\x21\xd7\x42\x0e\x43\xf6\xed\xa2" \ 22 #define DEV_OFF_REC_ON_SHA1_DIGEST ((uint8_t*) "\x3f\x29\x54\x64\x53\x67\x8b" \
23 "\x78\x4f") /* SHA1("\x00") */ 23 "\x85\x59\x31\xc1\x74\xa9\x7d\x6c\x08" \
24 "\x94\xb8\xf5\x46") /* SHA1("\x00\x01") */
25
26 #define DEV_ON_REC_OFF_SHA1_DIGEST ((uint8_t*) "\x0e\x35\x6b\xa5\x05\x63\x1f" \
27 "\xbf\x71\x57\x58\xbe\xd2\x7d\x50\x3f" \
28 "\x8b\x26\x0e\x3a") /* SHA1("\x01\x00") */
29
30 #define DEV_ON_REC_ON_SHA1_DIGEST ((uint8_t*) "\x91\x59\xcb\x8b\xce\xe7\xfc" \
31 "\xb9\x55\x82\xf1\x40\x96\x0c\xda\xe7" \
32 "\x27\x88\xd3\x26") /* SHA1("\x01\x01") */
24 33
25 static int g_rollback_recovery_mode = 0; 34 static int g_rollback_recovery_mode = 0;
26 35
27 /* disable MSVC warning on const logical expression (as in } while(0);) */ 36 /* disable MSVC warning on const logical expression (as in } while(0);) */
28 __pragma(warning (disable: 4127)) 37 __pragma(warning (disable: 4127))
29 38
30 #define RETURN_ON_FAILURE(tpm_command) do { \ 39 #define RETURN_ON_FAILURE(tpm_command) do { \
31 uint32_t result; \ 40 uint32_t result; \
32 if ((result = (tpm_command)) != TPM_SUCCESS) { \ 41 if ((result = (tpm_command)) != TPM_SUCCESS) { \
33 VBDEBUG(("Rollback: %08x returned by " #tpm_command "\n", (int)result)); \ 42 VBDEBUG(("Rollback: %08x returned by " #tpm_command "\n", (int)result)); \
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 355
347 356
348 uint32_t RollbackFirmwareSetup(int developer_mode, uint32_t* version) { 357 uint32_t RollbackFirmwareSetup(int developer_mode, uint32_t* version) {
349 RollbackSpaceFirmware rsf; 358 RollbackSpaceFirmware rsf;
350 uint8_t out_digest[20]; /* For PCR extend output */ 359 uint8_t out_digest[20]; /* For PCR extend output */
351 360
352 RETURN_ON_FAILURE(SetupTPM(0, developer_mode, &rsf)); 361 RETURN_ON_FAILURE(SetupTPM(0, developer_mode, &rsf));
353 *version = rsf.fw_versions; 362 *version = rsf.fw_versions;
354 VBDEBUG(("TPM: RollbackFirmwareSetup %x\n", (int)rsf.fw_versions)); 363 VBDEBUG(("TPM: RollbackFirmwareSetup %x\n", (int)rsf.fw_versions));
355 if (developer_mode) 364 if (developer_mode)
356 RETURN_ON_FAILURE(TlclExtend(DEV_MODE_PCR, DEV_MODE_ON_SHA1_DIGEST, 365 RETURN_ON_FAILURE(TlclExtend(DEV_REC_MODE_PCR, DEV_ON_REC_OFF_SHA1_DIGEST,
357 out_digest)); 366 out_digest));
358 else 367 else
359 RETURN_ON_FAILURE(TlclExtend(DEV_MODE_PCR, DEV_MODE_OFF_SHA1_DIGEST, 368 RETURN_ON_FAILURE(TlclExtend(DEV_REC_MODE_PCR, DEV_OFF_REC_OFF_SHA1_DIGEST,
360 out_digest)); 369 out_digest));
361 VBDEBUG(("TPM: RollbackFirmwareSetup dev mode PCR out_digest %02x %02x %02x " 370 VBDEBUG(("TPM: RollbackFirmwareSetup dev mode PCR out_digest %02x %02x %02x "
362 "%02x\n", out_digest, out_digest+1, out_digest+2, out_digest+3)); 371 "%02x\n", out_digest, out_digest+1, out_digest+2, out_digest+3));
363 372
364 return TPM_SUCCESS; 373 return TPM_SUCCESS;
365 } 374 }
366 375
367 uint32_t RollbackFirmwareWrite(uint32_t version) { 376 uint32_t RollbackFirmwareWrite(uint32_t version) {
368 RollbackSpaceFirmware rsf; 377 RollbackSpaceFirmware rsf;
369 378
370 RETURN_ON_FAILURE(ReadSpaceFirmware(&rsf)); 379 RETURN_ON_FAILURE(ReadSpaceFirmware(&rsf));
371 VBDEBUG(("TPM: RollbackFirmwareWrite %x --> %x\n", (int)rsf.fw_versions, 380 VBDEBUG(("TPM: RollbackFirmwareWrite %x --> %x\n", (int)rsf.fw_versions,
372 (int)version)); 381 (int)version));
373 rsf.fw_versions = version; 382 rsf.fw_versions = version;
374 return WriteSpaceFirmware(&rsf); 383 return WriteSpaceFirmware(&rsf);
375 } 384 }
376 385
377 uint32_t RollbackFirmwareLock(void) { 386 uint32_t RollbackFirmwareLock(void) {
378 return TlclSetGlobalLock(); 387 return TlclSetGlobalLock();
379 } 388 }
380 389
381 uint32_t RollbackKernelRecovery(int developer_mode) { 390 uint32_t RollbackKernelRecovery(int developer_mode) {
391 uint32_t rvs, rve;
382 RollbackSpaceFirmware rsf; 392 RollbackSpaceFirmware rsf;
393 uint8_t out_digest[20]; /* For PCR extend output */
383 394
384 /* In recovery mode we ignore TPM malfunctions or corruptions, and * 395 /* In recovery mode we ignore TPM malfunctions or corruptions, and *
385 * leave the TPM complelely unlocked; we call neither 396 * leave the TPM complelely unlocked; we call neither
386 * TlclSetGlobalLock() nor TlclLockPhysicalPresence(). The recovery 397 * TlclSetGlobalLock() nor TlclLockPhysicalPresence(). The recovery
387 * kernel will fix the TPM (if needed) and lock it ASAP. We leave 398 * kernel will fix the TPM (if needed) and lock it ASAP. We leave
388 * Physical Presence on in either case. */ 399 * Physical Presence on in either case. */
389 return SetupTPM(1, developer_mode, &rsf); 400 rvs = SetupTPM(1, developer_mode, &rsf);
401 if (developer_mode)
402 rve = TlclExtend(DEV_REC_MODE_PCR, DEV_ON_REC_ON_SHA1_DIGEST, out_digest);
403 else
404 rve = TlclExtend(DEV_REC_MODE_PCR, DEV_OFF_REC_ON_SHA1_DIGEST, out_digest);
405 VBDEBUG(("TPM: RollbackKernelRecovery dev mode PCR out_digest %02x %02x %02x "
406 "%02x\n", out_digest, out_digest+1, out_digest+2, out_digest+3));
407 return (TPM_SUCCESS == rvs) ? rve : rvs;
390 } 408 }
391 409
392 uint32_t RollbackKernelRead(uint32_t* version) { 410 uint32_t RollbackKernelRead(uint32_t* version) {
393 if (g_rollback_recovery_mode) { 411 if (g_rollback_recovery_mode) {
394 *version = 0; 412 *version = 0;
395 } else { 413 } else {
396 RollbackSpaceKernel rsk; 414 RollbackSpaceKernel rsk;
397 uint32_t perms; 415 uint32_t perms;
398 416
399 /* Read the kernel space and verify its permissions. If the kernel 417 /* Read the kernel space and verify its permissions. If the kernel
(...skipping 28 matching lines...) Expand all
428 446
429 uint32_t RollbackKernelLock(void) { 447 uint32_t RollbackKernelLock(void) {
430 if (g_rollback_recovery_mode) { 448 if (g_rollback_recovery_mode) {
431 return TPM_SUCCESS; 449 return TPM_SUCCESS;
432 } else { 450 } else {
433 return TlclLockPhysicalPresence(); 451 return TlclLockPhysicalPresence();
434 } 452 }
435 } 453 }
436 454
437 #endif // DISABLE_ROLLBACK_TPM 455 #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