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

Side by Side Diff: src/platform/vboot_reference/utils/firmware_image.c

Issue 1320010: VBoot Reference: Add kernel rollback prevention and choosing logic. (Closed)
Patch Set: fix priority in test case Created 10 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
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 generating and manipulating a verified boot firmware image. 5 * Functions for generating and manipulating a verified boot firmware image.
6 */ 6 */
7 7
8 #include "firmware_image.h" 8 #include "firmware_image.h"
9 9
10 #include <fcntl.h> 10 #include <fcntl.h>
(...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after
673 min_lversion = Min(firmwareA_lversion, firmwareB_lversion); 673 min_lversion = Min(firmwareA_lversion, firmwareB_lversion);
674 stored_lversion = CombineUint16Pair(GetStoredVersion(FIRMWARE_KEY_VERSION), 674 stored_lversion = CombineUint16Pair(GetStoredVersion(FIRMWARE_KEY_VERSION),
675 GetStoredVersion(FIRMWARE_VERSION)); 675 GetStoredVersion(FIRMWARE_VERSION));
676 /* Always try FirmwareA first. */ 676 /* Always try FirmwareA first. */
677 if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareA)) 677 if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareA))
678 firmwareA_is_verified = 1; 678 firmwareA_is_verified = 1;
679 if (firmwareA_is_verified && (stored_lversion < firmwareA_lversion)) { 679 if (firmwareA_is_verified && (stored_lversion < firmwareA_lversion)) {
680 /* Stored version may need to be updated but only if FirmwareB 680 /* Stored version may need to be updated but only if FirmwareB
681 * is successfully verified and has a logical version greater than 681 * is successfully verified and has a logical version greater than
682 * the stored logical version. */ 682 * the stored logical version. */
683 if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareB)) { 683 if (stored_lversion < firmwareB_lversion) {
684 if (stored_lversion < firmwareB_lversion) { 684 if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareB)) {
685 WriteStoredVersion(FIRMWARE_KEY_VERSION, 685 WriteStoredVersion(FIRMWARE_KEY_VERSION,
686 (uint16_t) (min_lversion >> 16)); 686 (uint16_t) (min_lversion >> 16));
687 WriteStoredVersion(FIRMWARE_VERSION, 687 WriteStoredVersion(FIRMWARE_VERSION,
688 (uint16_t) (min_lversion & 0x00FFFF)); 688 (uint16_t) (min_lversion & 0x00FFFF));
689 stored_lversion = min_lversion; /* Update stored version as it's used 689 stored_lversion = min_lversion; /* Update stored version as it's used
690 * later. */ 690 * later. */
691 } 691 }
692 } 692 }
693 } 693 }
694 /* Lock Firmware TPM rollback indices from further writes. */ 694 /* Lock Firmware TPM rollback indices from further writes. */
695 /* TODO(gauravsh): Figure out if these can be combined into one 695 /* TODO(gauravsh): Figure out if these can be combined into one
696 * 32-bit location since we seem to always use them together. This can help 696 * 32-bit location since we seem to always use them together. This can help
697 * us minimize the number of NVRAM writes/locks (which are limited over flash 697 * us minimize the number of NVRAM writes/locks (which are limited over flash
698 * memory lifetimes. 698 * memory lifetimes.
699 */ 699 */
700 LockStoredVersion(FIRMWARE_KEY_VERSION); 700 LockStoredVersion(FIRMWARE_KEY_VERSION);
701 LockStoredVersion(FIRMWARE_VERSION); 701 LockStoredVersion(FIRMWARE_VERSION);
(...skipping 15 matching lines...) Expand all
717 if (stored_lversion <= firmwareA_lversion) 717 if (stored_lversion <= firmwareA_lversion)
718 return BOOT_FIRMWARE_A_CONTINUE; 718 return BOOT_FIRMWARE_A_CONTINUE;
719 } else { 719 } else {
720 /* If FirmwareA was not valid, then we skipped over the 720 /* If FirmwareA was not valid, then we skipped over the
721 * check to update the rollback indices and a Verify of FirmwareB wasn't 721 * check to update the rollback indices and a Verify of FirmwareB wasn't
722 * attempted. 722 * attempted.
723 * If FirmwareB is not a rollback, then we attempt to do the verification. 723 * If FirmwareB is not a rollback, then we attempt to do the verification.
724 */ 724 */
725 if (stored_lversion <= firmwareB_lversion && 725 if (stored_lversion <= firmwareB_lversion &&
726 (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareB))) 726 (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareB)))
727 return BOOT_FIRMWARE_B_CONTINUE; 727 return BOOT_FIRMWARE_B_CONTINUE;
728 } 728 }
729 /* D'oh: No bootable firmware. */ 729 /* D'oh: No bootable firmware. */
730 return BOOT_FIRMWARE_RECOVERY_CONTINUE; 730 return BOOT_FIRMWARE_RECOVERY_CONTINUE;
731 } 731 }
OLDNEW
« no previous file with comments | « src/platform/vboot_reference/tests/test_common.c ('k') | src/platform/vboot_reference/utils/kernel_image.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698