| 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 |
| 16 /* TPM PCR to use for storing dev mode measurements */ |
| 17 #define DEV_MODE_PCR 0 |
| 18 /* Input digests for PCR extend */ |
| 19 #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" \ |
| 21 "\xdf\xf7") /* SHA1("\x01") */ |
| 22 #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" \ |
| 24 "\x78\x4f") /* SHA1("\x00") */ |
| 25 |
| 15 static int g_rollback_recovery_mode = 0; | 26 static int g_rollback_recovery_mode = 0; |
| 16 | 27 |
| 17 /* disable MSVC warning on const logical expression (as in } while(0);) */ | 28 /* disable MSVC warning on const logical expression (as in } while(0);) */ |
| 18 __pragma(warning (disable: 4127)) | 29 __pragma(warning (disable: 4127)) |
| 19 | 30 |
| 20 #define RETURN_ON_FAILURE(tpm_command) do { \ | 31 #define RETURN_ON_FAILURE(tpm_command) do { \ |
| 21 uint32_t result; \ | 32 uint32_t result; \ |
| 22 if ((result = (tpm_command)) != TPM_SUCCESS) { \ | 33 if ((result = (tpm_command)) != TPM_SUCCESS) { \ |
| 23 VBDEBUG(("Rollback: %08x returned by " #tpm_command "\n", (int)result)); \ | 34 VBDEBUG(("Rollback: %08x returned by " #tpm_command "\n", (int)result)); \ |
| 24 return result; \ | 35 return result; \ |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 | 282 |
| 272 uint32_t RollbackKernelWrite(uint32_t version) { | 283 uint32_t RollbackKernelWrite(uint32_t version) { |
| 273 return TPM_SUCCESS; | 284 return TPM_SUCCESS; |
| 274 } | 285 } |
| 275 | 286 |
| 276 uint32_t RollbackKernelLock(void) { | 287 uint32_t RollbackKernelLock(void) { |
| 277 return TPM_SUCCESS; | 288 return TPM_SUCCESS; |
| 278 } | 289 } |
| 279 | 290 |
| 280 #else | 291 #else |
| 281 | |
| 282 uint32_t RollbackFirmwareSetup(int developer_mode, uint32_t* version) { | 292 uint32_t RollbackFirmwareSetup(int developer_mode, uint32_t* version) { |
| 283 RollbackSpaceFirmware rsf; | 293 RollbackSpaceFirmware rsf; |
| 294 uint8_t out_digest[20]; /* For PCR extend output */ |
| 284 | 295 |
| 285 RETURN_ON_FAILURE(SetupTPM(0, developer_mode, &rsf)); | 296 RETURN_ON_FAILURE(SetupTPM(0, developer_mode, &rsf)); |
| 286 *version = rsf.fw_versions; | 297 *version = rsf.fw_versions; |
| 287 VBDEBUG(("TPM: RollbackFirmwareSetup %x\n", (int)rsf.fw_versions)); | 298 VBDEBUG(("TPM: RollbackFirmwareSetup %x\n", (int)rsf.fw_versions)); |
| 299 if (developer_mode) |
| 300 RETURN_ON_FAILURE(TlclExtend(DEV_MODE_PCR, DEV_MODE_ON_SHA1_DIGEST, |
| 301 out_digest)); |
| 302 else |
| 303 RETURN_ON_FAILURE(TlclExtend(DEV_MODE_PCR, DEV_MODE_OFF_SHA1_DIGEST, |
| 304 out_digest)); |
| 305 VBDEBUG(("TPM: RollbackFirmwareSetup dev mode PCR out_digest %02x %02x %02x " |
| 306 "%02x", out_digest, out_digest+1, out_digest+2, out_digest+3)); |
| 307 |
| 288 return TPM_SUCCESS; | 308 return TPM_SUCCESS; |
| 289 } | 309 } |
| 290 | 310 |
| 291 uint32_t RollbackFirmwareWrite(uint32_t version) { | 311 uint32_t RollbackFirmwareWrite(uint32_t version) { |
| 292 RollbackSpaceFirmware rsf; | 312 RollbackSpaceFirmware rsf; |
| 293 | 313 |
| 294 RETURN_ON_FAILURE(ReadSpaceFirmware(&rsf)); | 314 RETURN_ON_FAILURE(ReadSpaceFirmware(&rsf)); |
| 295 VBDEBUG(("TPM: RollbackFirmwareWrite %x --> %x\n", (int)rsf.fw_versions, | 315 VBDEBUG(("TPM: RollbackFirmwareWrite %x --> %x\n", (int)rsf.fw_versions, |
| 296 (int)version)); | 316 (int)version)); |
| 297 rsf.fw_versions = version; | 317 rsf.fw_versions = version; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 | 376 |
| 357 uint32_t RollbackKernelLock(void) { | 377 uint32_t RollbackKernelLock(void) { |
| 358 if (g_rollback_recovery_mode) { | 378 if (g_rollback_recovery_mode) { |
| 359 return TPM_SUCCESS; | 379 return TPM_SUCCESS; |
| 360 } else { | 380 } else { |
| 361 return TlclLockPhysicalPresence(); | 381 return TlclLockPhysicalPresence(); |
| 362 } | 382 } |
| 363 } | 383 } |
| 364 | 384 |
| 365 #endif // DISABLE_ROLLBACK_TPM | 385 #endif // DISABLE_ROLLBACK_TPM |
| OLD | NEW |