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

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

Issue 6685075: Add TPM version checking (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/vboot_reference.git@master
Patch Set: Created 9 years, 9 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 | « firmware/lib/include/rollback_index.h ('k') | firmware/lib/vboot_firmware.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-2011 The Chromium OS Authors. All rights reserved. 1 /* Copyright (c) 2010-2011 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 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 /* Initializes the TPM, but ignores return codes. In ChromeOS 294 /* Initializes the TPM, but ignores return codes. In ChromeOS
295 * environment, doesn't even talk to the TPM. */ 295 * environment, doesn't even talk to the TPM. */
296 TlclLibInit(); 296 TlclLibInit();
297 TlclStartup(); 297 TlclStartup();
298 TlclContinueSelfTest(); 298 TlclContinueSelfTest();
299 #endif 299 #endif
300 *version = 0; 300 *version = 0;
301 return TPM_SUCCESS; 301 return TPM_SUCCESS;
302 } 302 }
303 303
304 uint32_t RollbackFirmwareRead(uint32_t* version) {
305 *version = 0;
306 return TPM_SUCCESS;
307 }
308
304 uint32_t RollbackFirmwareWrite(uint32_t version) { 309 uint32_t RollbackFirmwareWrite(uint32_t version) {
305 return TPM_SUCCESS; 310 return TPM_SUCCESS;
306 } 311 }
307 312
308 uint32_t RollbackFirmwareLock(void) { 313 uint32_t RollbackFirmwareLock(void) {
309 return TPM_SUCCESS; 314 return TPM_SUCCESS;
310 } 315 }
311 316
312 uint32_t RollbackKernelRecovery(int developer_mode) { 317 uint32_t RollbackKernelRecovery(int developer_mode) {
313 #ifndef CHROMEOS_ENVIRONMENT 318 #ifndef CHROMEOS_ENVIRONMENT
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 355
351 uint32_t RollbackFirmwareSetup(int developer_mode, uint32_t* version) { 356 uint32_t RollbackFirmwareSetup(int developer_mode, uint32_t* version) {
352 RollbackSpaceFirmware rsf; 357 RollbackSpaceFirmware rsf;
353 358
354 RETURN_ON_FAILURE(SetupTPM(0, developer_mode, &rsf)); 359 RETURN_ON_FAILURE(SetupTPM(0, developer_mode, &rsf));
355 *version = rsf.fw_versions; 360 *version = rsf.fw_versions;
356 VBDEBUG(("TPM: RollbackFirmwareSetup %x\n", (int)rsf.fw_versions)); 361 VBDEBUG(("TPM: RollbackFirmwareSetup %x\n", (int)rsf.fw_versions));
357 return TPM_SUCCESS; 362 return TPM_SUCCESS;
358 } 363 }
359 364
365 uint32_t RollbackFirmwareRead(uint32_t* version) {
366 RollbackSpaceFirmware rsf;
367
368 RETURN_ON_FAILURE(ReadSpaceFirmware(&rsf));
369 VBDEBUG(("TPM: RollbackFirmwareRead %x --> %x\n", (int)rsf.fw_versions,
370 (int)version));
371 *version = rsf.fw_versions;
372 VBDEBUG(("TPM: RollbackFirmwareRead %x\n", (int)rsf.fw_versions));
373 return TPM_SUCCESS;
374 }
360 375
361 uint32_t RollbackFirmwareWrite(uint32_t version) { 376 uint32_t RollbackFirmwareWrite(uint32_t version) {
362 RollbackSpaceFirmware rsf; 377 RollbackSpaceFirmware rsf;
363 378
364 RETURN_ON_FAILURE(ReadSpaceFirmware(&rsf)); 379 RETURN_ON_FAILURE(ReadSpaceFirmware(&rsf));
365 VBDEBUG(("TPM: RollbackFirmwareWrite %x --> %x\n", (int)rsf.fw_versions, 380 VBDEBUG(("TPM: RollbackFirmwareWrite %x --> %x\n", (int)rsf.fw_versions,
366 (int)version)); 381 (int)version));
367 rsf.fw_versions = version; 382 rsf.fw_versions = version;
368 return WriteSpaceFirmware(&rsf); 383 return WriteSpaceFirmware(&rsf);
369 } 384 }
(...skipping 13 matching lines...) Expand all
383 * Physical Presence on in either case. */ 398 * Physical Presence on in either case. */
384 rvs = SetupTPM(1, developer_mode, &rsf); 399 rvs = SetupTPM(1, developer_mode, &rsf);
385 rve = SetTPMBootModeState(developer_mode, 400 rve = SetTPMBootModeState(developer_mode,
386 1, /* Recovery Mode Status. */ 401 1, /* Recovery Mode Status. */
387 0); /* In recovery mode, there is no RW firmware 402 0); /* In recovery mode, there is no RW firmware
388 * keyblock flag. */ 403 * keyblock flag. */
389 return (TPM_SUCCESS == rvs) ? rve : rvs; 404 return (TPM_SUCCESS == rvs) ? rve : rvs;
390 } 405 }
391 406
392 uint32_t RollbackKernelRead(uint32_t* version) { 407 uint32_t RollbackKernelRead(uint32_t* version) {
393 if (g_rollback_recovery_mode) { 408 RollbackSpaceKernel rsk;
394 *version = 0; 409 uint32_t perms;
395 } else {
396 RollbackSpaceKernel rsk;
397 uint32_t perms;
398 410
399 /* Read the kernel space and verify its permissions. If the kernel 411 /* Read the kernel space and verify its permissions. If the kernel
400 * space has the wrong permission, or it doesn't contain the right 412 * space has the wrong permission, or it doesn't contain the right
401 * identifier, we give up. This will need to be fixed by the 413 * identifier, we give up. This will need to be fixed by the
402 * recovery kernel. We have to worry about this because at any time 414 * recovery kernel. We have to worry about this because at any time
403 * (even with PP turned off) the TPM owner can remove and redefine a 415 * (even with PP turned off) the TPM owner can remove and redefine a
404 * PP-protected space (but not write to it). */ 416 * PP-protected space (but not write to it). */
405 RETURN_ON_FAILURE(ReadSpaceKernel(&rsk)); 417 RETURN_ON_FAILURE(ReadSpaceKernel(&rsk));
406 RETURN_ON_FAILURE(TlclGetPermissions(KERNEL_NV_INDEX, &perms)); 418 RETURN_ON_FAILURE(TlclGetPermissions(KERNEL_NV_INDEX, &perms));
407 if (TPM_NV_PER_PPWRITE != perms || ROLLBACK_SPACE_KERNEL_UID != rsk.uid) 419 if (TPM_NV_PER_PPWRITE != perms || ROLLBACK_SPACE_KERNEL_UID != rsk.uid)
408 return TPM_E_CORRUPTED_STATE; 420 return TPM_E_CORRUPTED_STATE;
409 421
410 *version = rsk.kernel_versions; 422 *version = rsk.kernel_versions;
411 VBDEBUG(("TPM: RollbackKernelRead %x\n", (int)rsk.kernel_versions)); 423 VBDEBUG(("TPM: RollbackKernelRead %x\n", (int)rsk.kernel_versions));
412 }
413 return TPM_SUCCESS; 424 return TPM_SUCCESS;
414 } 425 }
415 426
416 uint32_t RollbackKernelWrite(uint32_t version) { 427 uint32_t RollbackKernelWrite(uint32_t version) {
417 if (g_rollback_recovery_mode) { 428 RollbackSpaceKernel rsk;
418 return TPM_SUCCESS; 429 RETURN_ON_FAILURE(ReadSpaceKernel(&rsk));
419 } else { 430 VBDEBUG(("TPM: RollbackKernelWrite %x --> %x\n", (int)rsk.kernel_versions,
420 RollbackSpaceKernel rsk; 431 (int)version));
421 RETURN_ON_FAILURE(ReadSpaceKernel(&rsk)); 432 rsk.kernel_versions = version;
422 VBDEBUG(("TPM: RollbackKernelWrite %x --> %x\n", (int)rsk.kernel_versions, 433 return WriteSpaceKernel(&rsk);
423 (int)version));
424 rsk.kernel_versions = version;
425 return WriteSpaceKernel(&rsk);
426 }
427 } 434 }
428 435
429 uint32_t RollbackKernelLock(void) { 436 uint32_t RollbackKernelLock(void) {
430 if (g_rollback_recovery_mode) { 437 if (g_rollback_recovery_mode) {
431 return TPM_SUCCESS; 438 return TPM_SUCCESS;
432 } else { 439 } else {
433 return TlclLockPhysicalPresence(); 440 return TlclLockPhysicalPresence();
434 } 441 }
435 } 442 }
436 443
437 #endif // DISABLE_ROLLBACK_TPM 444 #endif // DISABLE_ROLLBACK_TPM
OLDNEW
« no previous file with comments | « firmware/lib/include/rollback_index.h ('k') | firmware/lib/vboot_firmware.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698