Index: firmware/lib/vboot_firmware.c |
diff --git a/firmware/lib/vboot_firmware.c b/firmware/lib/vboot_firmware.c |
index ca2cd7779e17ae2c8c0651d601b6e9adfc88470b..f76e3452cf5e7944b3aabc93ee3a7012dffa6911 100644 |
--- a/firmware/lib/vboot_firmware.c |
+++ b/firmware/lib/vboot_firmware.c |
@@ -36,10 +36,8 @@ int LoadFirmware(LoadFirmwareParams* params) { |
VbPublicKey* root_key = (VbPublicKey*)params->firmware_root_key_blob; |
VbLoadFirmwareInternal* lfi; |
- uint16_t tpm_key_version = 0; |
- uint16_t tpm_fw_version = 0; |
- uint64_t lowest_key_version = 0xFFFF; |
- uint64_t lowest_fw_version = 0xFFFF; |
+ uint32_t tpm_version = 0; |
+ uint64_t lowest_version = 0xFFFFFFFF; |
uint32_t status; |
int good_index = -1; |
int index; |
@@ -62,7 +60,7 @@ int LoadFirmware(LoadFirmwareParams* params) { |
/* Initialize the TPM and read rollback indices. */ |
status = RollbackFirmwareSetup(params->boot_flags & BOOT_FLAG_DEVELOPER, |
- &tpm_key_version, &tpm_fw_version); |
+ &tpm_version); |
if (0 != status) { |
VBDEBUG(("Unable to setup TPM and read stored versions.\n")); |
return (status == TPM_E_MUST_REBOOT ? |
@@ -82,6 +80,7 @@ int LoadFirmware(LoadFirmwareParams* params) { |
VbFirmwarePreambleHeader* preamble; |
RSAPublicKey* data_key; |
uint64_t key_version; |
+ uint64_t combined_version; |
uint8_t* body_digest; |
/* Verify the key block */ |
@@ -99,7 +98,7 @@ int LoadFirmware(LoadFirmwareParams* params) { |
/* Check for rollback of key version. */ |
key_version = key_block->data_key.key_version; |
- if (key_version < tpm_key_version) { |
+ if (key_version < (tpm_version >> 16)) { |
VBDEBUG(("Key rollback detected.\n")); |
continue; |
} |
@@ -123,22 +122,17 @@ int LoadFirmware(LoadFirmwareParams* params) { |
} |
/* Check for rollback of firmware version. */ |
- if (key_version == tpm_key_version && |
- preamble->firmware_version < tpm_fw_version) { |
+ combined_version = ((key_version << 16) | |
+ (preamble->firmware_version & 0xFFFF)); |
+ if (combined_version < tpm_version) { |
VBDEBUG(("Firmware version rollback detected.\n")); |
RSAPublicKeyFree(data_key); |
continue; |
} |
/* Check for lowest key version from a valid header. */ |
- if (lowest_key_version > key_version) { |
- lowest_key_version = key_version; |
- lowest_fw_version = preamble->firmware_version; |
- } |
- else if (lowest_key_version == key_version && |
- lowest_fw_version > preamble->firmware_version) { |
- lowest_fw_version = preamble->firmware_version; |
- } |
+ if (lowest_version > combined_version) |
+ lowest_version = combined_version; |
/* If we already have good firmware, no need to read another one; |
* we only needed to look at the versions to check for |
@@ -202,8 +196,7 @@ int LoadFirmware(LoadFirmwareParams* params) { |
* then the TPM doesn't need updating; we can stop now. |
* Otherwise, we'll check all the other headers to see if they |
* contain a newer key. */ |
- if (key_version == tpm_key_version && |
- preamble->firmware_version == tpm_fw_version) |
+ if (combined_version == tpm_version) |
break; |
} |
} |
@@ -216,12 +209,8 @@ int LoadFirmware(LoadFirmwareParams* params) { |
if (good_index >= 0) { |
/* Update TPM if necessary */ |
- if ((lowest_key_version > tpm_key_version) || |
- (lowest_key_version == tpm_key_version && |
- lowest_fw_version > tpm_fw_version)) { |
- |
- status = RollbackFirmwareWrite((uint16_t)lowest_key_version, |
- (uint16_t)lowest_fw_version); |
+ if (lowest_version > tpm_version) { |
+ status = RollbackFirmwareWrite((uint32_t)lowest_version); |
if (0 != status) { |
VBDEBUG(("Unable to write stored versions.\n")); |
return (status == TPM_E_MUST_REBOOT ? |