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 |
11 #include "cryptolib.h" | 11 #include "cryptolib.h" |
12 #include "rollback_index.h" | 12 #include "rollback_index.h" |
| 13 #include "tss_constants.h" |
13 #include "utility.h" | 14 #include "utility.h" |
14 | 15 |
15 /* Macro to determine the size of a field structure in the FirmwareImage | 16 /* Macro to determine the size of a field structure in the FirmwareImage |
16 * structure. */ | 17 * structure. */ |
17 #define FIELD_LEN(field) (sizeof(((FirmwareImage*)0)->field)) | 18 #define FIELD_LEN(field) (sizeof(((FirmwareImage*)0)->field)) |
18 | 19 |
19 char* kVerifyFirmwareErrors[VERIFY_FIRMWARE_MAX] = { | 20 char* kVerifyFirmwareErrors[VERIFY_FIRMWARE_MAX] = { |
20 "Success.", | 21 "Success.", |
21 "Invalid Image.", | 22 "Invalid Image.", |
22 "Root Key Signature Failed.", | 23 "Root Key Signature Failed.", |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 (uint16_t) (min_lversion & 0xFFFF)); | 304 (uint16_t) (min_lversion & 0xFFFF)); |
304 stored_lversion = min_lversion; /* Update stored version as it's used | 305 stored_lversion = min_lversion; /* Update stored version as it's used |
305 * later. */ | 306 * later. */ |
306 } | 307 } |
307 } | 308 } |
308 } | 309 } |
309 /* Lock Firmware TPM rollback indices from further writes. In this design, | 310 /* Lock Firmware TPM rollback indices from further writes. In this design, |
310 * this is done by setting the globalLock bit, which is cleared only by | 311 * this is done by setting the globalLock bit, which is cleared only by |
311 * TPM_Init at reboot. | 312 * TPM_Init at reboot. |
312 */ | 313 */ |
313 LockFirmwareVersions(); | 314 if (TPM_SUCCESS != LockFirmwareVersions()) { |
| 315 return VERIFY_FIRMWARE_TPM_ERROR; |
| 316 } |
314 | 317 |
315 /* Determine which firmware (if any) to jump to. | 318 /* Determine which firmware (if any) to jump to. |
316 * | 319 * |
317 * We always attempt to jump to FirmwareA first. If verification of FirmwareA | 320 * We always attempt to jump to FirmwareA first. If verification of FirmwareA |
318 * fails, we try FirmwareB. In all cases, if the firmware successfully | 321 * fails, we try FirmwareB. In all cases, if the firmware successfully |
319 * verified but is a rollback, we jump to recovery. | 322 * verified but is a rollback, we jump to recovery. |
320 * | 323 * |
321 * Note: This means that if FirmwareA verified successfully and is a | 324 * Note: This means that if FirmwareA verified successfully and is a |
322 * rollback, then no attempt is made to check FirmwareB. We still jump to | 325 * rollback, then no attempt is made to check FirmwareB. We still jump to |
323 * recovery. FirmwareB is only used as a backup in case FirmwareA gets | 326 * recovery. FirmwareB is only used as a backup in case FirmwareA gets |
(...skipping 12 matching lines...) Expand all Loading... |
336 */ | 339 */ |
337 if (stored_lversion <= firmwareB_lversion && | 340 if (stored_lversion <= firmwareB_lversion && |
338 (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, | 341 (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, |
339 verification_headerB, | 342 verification_headerB, |
340 firmwareB))) | 343 firmwareB))) |
341 return BOOT_FIRMWARE_B_CONTINUE; | 344 return BOOT_FIRMWARE_B_CONTINUE; |
342 } | 345 } |
343 /* D'oh: No bootable firmware. */ | 346 /* D'oh: No bootable firmware. */ |
344 return BOOT_FIRMWARE_RECOVERY_CONTINUE; | 347 return BOOT_FIRMWARE_RECOVERY_CONTINUE; |
345 } | 348 } |
OLD | NEW |