| 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 verifying a verified boot firmware image. |    5  * Functions for verifying a verified boot firmware image. | 
|    6  * (Firmware Portion) |    6  * (Firmware Portion) | 
|    7  */ |    7  */ | 
|    8  |    8  | 
|    9 #include "firmware_image_fw.h" |    9 #include "firmware_image_fw.h" | 
|   10  |   10  | 
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  245                            uint8_t* verification_headerB, |  245                            uint8_t* verification_headerB, | 
|  246                            uint8_t* firmwareB) { |  246                            uint8_t* firmwareB) { | 
|  247   /* Contains the logical firmware version (32-bit) which is calculated as |  247   /* Contains the logical firmware version (32-bit) which is calculated as | 
|  248    * (firmware_key_version << 16 | firmware_version) where |  248    * (firmware_key_version << 16 | firmware_version) where | 
|  249    * [firmware_key_version] [firmware_version] are both 16-bit. |  249    * [firmware_key_version] [firmware_version] are both 16-bit. | 
|  250    */ |  250    */ | 
|  251   uint32_t firmwareA_lversion, firmwareB_lversion; |  251   uint32_t firmwareA_lversion, firmwareB_lversion; | 
|  252   uint8_t firmwareA_is_verified = 0;  /* Whether firmwareA verify succeeded. */ |  252   uint8_t firmwareA_is_verified = 0;  /* Whether firmwareA verify succeeded. */ | 
|  253   uint32_t min_lversion;  /* Minimum of firmware A and firmware lversion. */ |  253   uint32_t min_lversion;  /* Minimum of firmware A and firmware lversion. */ | 
|  254   uint32_t stored_lversion;  /* Stored logical version in the TPM. */ |  254   uint32_t stored_lversion;  /* Stored logical version in the TPM. */ | 
 |  255   uint16_t version, key_version;  /* Temporary variables */ | 
|  255  |  256  | 
|  256   /* Initialize the TPM since we'll be reading the rollback indices. */ |  257   /* Initialize the TPM since we'll be reading the rollback indices. */ | 
|  257   SetupTPM(); |  258   SetupTPM(); | 
|  258  |  259  | 
|  259   /* We get the key versions by reading directly from the image blobs without |  260   /* We get the key versions by reading directly from the image blobs without | 
|  260    * any additional (expensive) sanity checking on the blob since it's faster to |  261    * any additional (expensive) sanity checking on the blob since it's faster to | 
|  261    * outright reject a firmware with an older firmware key version. A malformed |  262    * outright reject a firmware with an older firmware key version. A malformed | 
|  262    * or corrupted firmware blob will still fail when VerifyFirmware() is called |  263    * or corrupted firmware blob will still fail when VerifyFirmware() is called | 
|  263    * on it. |  264    * on it. | 
|  264    */ |  265    */ | 
|  265   firmwareA_lversion = GetLogicalFirmwareVersion(verification_headerA); |  266   firmwareA_lversion = GetLogicalFirmwareVersion(verification_headerA); | 
|  266   firmwareB_lversion = GetLogicalFirmwareVersion(verification_headerB); |  267   firmwareB_lversion = GetLogicalFirmwareVersion(verification_headerB); | 
|  267   min_lversion  = Min(firmwareA_lversion, firmwareB_lversion); |  268   min_lversion  = Min(firmwareA_lversion, firmwareB_lversion); | 
|  268   stored_lversion = CombineUint16Pair(GetStoredVersion(FIRMWARE_KEY_VERSION), |  269   GetStoredVersions(FIRMWARE_VERSIONS, &key_version, &version); | 
|  269                                       GetStoredVersion(FIRMWARE_VERSION)); |  270   stored_lversion = CombineUint16Pair(key_version, version); | 
|  270   /* Always try FirmwareA first. */ |  271   /* Always try FirmwareA first. */ | 
|  271   if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, |  272   if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, | 
|  272                                                 verification_headerA, |  273                                                 verification_headerA, | 
|  273                                                 firmwareA)) |  274                                                 firmwareA)) | 
|  274     firmwareA_is_verified = 1; |  275     firmwareA_is_verified = 1; | 
|  275   if (firmwareA_is_verified && (stored_lversion < firmwareA_lversion)) { |  276   if (firmwareA_is_verified && (stored_lversion < firmwareA_lversion)) { | 
|  276     /* Stored version may need to be updated but only if FirmwareB |  277     /* Stored version may need to be updated but only if FirmwareB | 
|  277      * is successfully verified and has a logical version greater than |  278      * is successfully verified and has a logical version greater than | 
|  278      * the stored logical version. */ |  279      * the stored logical version. */ | 
|  279     if (stored_lversion < firmwareB_lversion) { |  280     if (stored_lversion < firmwareB_lversion) { | 
|  280       if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, |  281       if (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, | 
|  281                                                     verification_headerB, |  282                                                     verification_headerB, | 
|  282                                                     firmwareB)) { |  283                                                     firmwareB)) { | 
|  283         WriteStoredVersion(FIRMWARE_KEY_VERSION, |  284         WriteStoredVersions(FIRMWARE_VERSIONS, | 
|  284                            (uint16_t) (min_lversion >> 16)); |  285                             (uint16_t) (min_lversion >> 16), | 
|  285         WriteStoredVersion(FIRMWARE_VERSION, |  286                             (uint16_t) (min_lversion & 0xFFFF)); | 
|  286                            (uint16_t) (min_lversion & 0x00FFFF)); |  | 
|  287         stored_lversion = min_lversion;  /* Update stored version as it's used |  287         stored_lversion = min_lversion;  /* Update stored version as it's used | 
|  288                                           * later. */ |  288                                           * later. */ | 
|  289       } |  289       } | 
|  290     } |  290     } | 
|  291   } |  291   } | 
|  292   /* Lock Firmware TPM rollback indices from further writes.  In this design, |  292   /* Lock Firmware TPM rollback indices from further writes.  In this design, | 
|  293    * this is done by setting the globalLock bit, which is cleared only by |  293    * this is done by setting the globalLock bit, which is cleared only by | 
|  294    * TPM_Init at reboot. |  294    * TPM_Init at reboot. | 
|  295    */ |  295    */ | 
|  296   LockFirmwareVersions(); |  296   LockFirmwareVersions(); | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
|  319      */ |  319      */ | 
|  320     if (stored_lversion <= firmwareB_lversion && |  320     if (stored_lversion <= firmwareB_lversion && | 
|  321         (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, |  321         (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, | 
|  322                                                    verification_headerB, |  322                                                    verification_headerB, | 
|  323                                                    firmwareB))) |  323                                                    firmwareB))) | 
|  324         return BOOT_FIRMWARE_B_CONTINUE; |  324         return BOOT_FIRMWARE_B_CONTINUE; | 
|  325   } |  325   } | 
|  326   /* D'oh: No bootable firmware. */ |  326   /* D'oh: No bootable firmware. */ | 
|  327   return BOOT_FIRMWARE_RECOVERY_CONTINUE; |  327   return BOOT_FIRMWARE_RECOVERY_CONTINUE; | 
|  328 } |  328 } | 
| OLD | NEW |