| 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 |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |