| Index: src/platform/vboot_reference/utils/firmware_image.c | 
| diff --git a/src/platform/vboot_reference/utils/firmware_image.c b/src/platform/vboot_reference/utils/firmware_image.c | 
| index 4098bb2330a61a7854f40e758b2b8c0fab23cc9a..13eba6c9bce9321fe42e8d43fefa966e7a168673 100644 | 
| --- a/src/platform/vboot_reference/utils/firmware_image.c | 
| +++ b/src/platform/vboot_reference/utils/firmware_image.c | 
| @@ -322,7 +322,6 @@ char* kVerifyFirmwareErrors[VERIFY_FIRMWARE_MAX] = { | 
|  | 
| int VerifyFirmwareHeader(const uint8_t* root_key_blob, | 
| const uint8_t* header_blob, | 
| -                         const int dev_mode, | 
| int* algorithm, | 
| int* header_len) { | 
| int firmware_sign_key_len; | 
| @@ -421,8 +420,7 @@ int VerifyFirmwareData(RSAPublicKey* firmware_sign_key, | 
| } | 
|  | 
| int VerifyFirmware(const uint8_t* root_key_blob, | 
| -                   const uint8_t* firmware_blob, | 
| -                   const int dev_mode) { | 
| +                   const uint8_t* firmware_blob) { | 
| int error_code; | 
| int algorithm;  /* Signing key algorithm. */ | 
| RSAPublicKey* firmware_sign_key = NULL; | 
| @@ -441,7 +439,7 @@ int VerifyFirmware(const uint8_t* root_key_blob, | 
| header_ptr = firmware_blob + FIRMWARE_MAGIC_SIZE; | 
|  | 
| /* Only continue if header verification succeeds. */ | 
| -  if ((error_code = VerifyFirmwareHeader(root_key_blob, header_ptr, dev_mode, | 
| +  if ((error_code = VerifyFirmwareHeader(root_key_blob, header_ptr, | 
| &algorithm, &header_len))) | 
| return error_code;  /* AKA jump to revovery. */ | 
|  | 
| @@ -481,8 +479,7 @@ int VerifyFirmware(const uint8_t* root_key_blob, | 
| } | 
|  | 
| int VerifyFirmwareImage(const RSAPublicKey* root_key, | 
| -                        const FirmwareImage* image, | 
| -                        const int dev_mode) { | 
| +                        const FirmwareImage* image) { | 
| RSAPublicKey* firmware_sign_key = NULL; | 
| uint8_t* header_digest = NULL; | 
| uint8_t* preamble_digest = NULL; | 
| @@ -502,31 +499,26 @@ int VerifyFirmwareImage(const RSAPublicKey* root_key, | 
| *  1) verifying the header length is correct. | 
| *  2) header_checksum is correct. | 
| */ | 
| -  /* TODO(gauravsh): The [dev_mode] switch is actually irrelevant | 
| -   * for the firmware verification. | 
| -   * Change this to always verify the root key signature and change | 
| -   * test expectations appropriately. | 
| -   */ | 
| -  if (!dev_mode) { | 
| -    DigestInit(&ctx, ROOT_SIGNATURE_ALGORITHM); | 
| -    DigestUpdate(&ctx, (uint8_t*) &image->header_len, | 
| -                 FIELD_LEN(header_len)); | 
| -    DigestUpdate(&ctx, (uint8_t*) &image->firmware_sign_algorithm, | 
| -                 FIELD_LEN(firmware_sign_algorithm)); | 
| -    DigestUpdate(&ctx, (uint8_t*) &image->firmware_key_version, | 
| -                 FIELD_LEN(firmware_key_version)); | 
| -    DigestUpdate(&ctx, image->firmware_sign_key, | 
| -                 RSAProcessedKeySize(image->firmware_sign_algorithm)); | 
| -    DigestUpdate(&ctx, image->header_checksum, | 
| -                 FIELD_LEN(header_checksum)); | 
| -    header_digest = DigestFinal(&ctx); | 
| -    if (!RSAVerify(root_key, image->firmware_key_signature, | 
| -                    FIELD_LEN(firmware_key_signature), | 
| -                    ROOT_SIGNATURE_ALGORITHM, | 
| -                    header_digest)) { | 
| -      error_code =  VERIFY_FIRMWARE_ROOT_SIGNATURE_FAILED; | 
| -      goto verify_failure; | 
| -    } | 
| + | 
| +  /* Check key signature. */ | 
| +  DigestInit(&ctx, ROOT_SIGNATURE_ALGORITHM); | 
| +  DigestUpdate(&ctx, (uint8_t*) &image->header_len, | 
| +               FIELD_LEN(header_len)); | 
| +  DigestUpdate(&ctx, (uint8_t*) &image->firmware_sign_algorithm, | 
| +               FIELD_LEN(firmware_sign_algorithm)); | 
| +  DigestUpdate(&ctx, (uint8_t*) &image->firmware_key_version, | 
| +               FIELD_LEN(firmware_key_version)); | 
| +  DigestUpdate(&ctx, image->firmware_sign_key, | 
| +               RSAProcessedKeySize(image->firmware_sign_algorithm)); | 
| +  DigestUpdate(&ctx, image->header_checksum, | 
| +               FIELD_LEN(header_checksum)); | 
| +  header_digest = DigestFinal(&ctx); | 
| +  if (!RSAVerify(root_key, image->firmware_key_signature, | 
| +                 FIELD_LEN(firmware_key_signature), | 
| +                 ROOT_SIGNATURE_ALGORITHM, | 
| +                 header_digest)) { | 
| +    error_code =  VERIFY_FIRMWARE_ROOT_SIGNATURE_FAILED; | 
| +    goto verify_failure; | 
| } | 
|  | 
| /* Get sign key to verify the rest of the firmware. */ | 
| @@ -682,15 +674,13 @@ int VerifyFirmwareDriver_f(uint8_t* root_key_blob, | 
| stored_lversion = CombineUint16Pair(GetStoredVersion(FIRMWARE_KEY_VERSION), | 
| GetStoredVersion(FIRMWARE_VERSION)); | 
| /* Always try FirmwareA first. */ | 
| -  if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareA, | 
| -                                                0)) | 
| +  if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareA)) | 
| firmwareA_is_verified = 1; | 
| if (firmwareA_is_verified && (stored_lversion < firmwareA_lversion)) { | 
| /* Stored version may need to be updated but only if FirmwareB | 
| * is successfully verified and has a logical version greater than | 
| * the stored logical version. */ | 
| -    if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareB, | 
| -                                                    0)) { | 
| +    if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareB)) { | 
| if (stored_lversion < firmwareB_lversion) { | 
| WriteStoredVersion(FIRMWARE_KEY_VERSION, | 
| (uint16_t) (min_lversion >> 16)); | 
| @@ -733,8 +723,7 @@ int VerifyFirmwareDriver_f(uint8_t* root_key_blob, | 
| * If FirmwareB is not a rollback, then we attempt to do the verification. | 
| */ | 
| if (stored_lversion <= firmwareB_lversion && | 
| -        (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareB, | 
| -                                                   0))) | 
| +        (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareB))) | 
| return BOOT_FIRMWARE_B_CONTINUE; | 
| } | 
| /* D'oh: No bootable firmware. */ | 
|  |