| 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 * High-level firmware API for loading and verifying rewritable firmware. | 5 * High-level firmware API for loading and verifying rewritable firmware. |
| 6 * (Firmware portion) | 6 * (Firmware portion) |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "load_firmware_fw.h" | 9 #include "load_firmware_fw.h" |
| 10 #include "rollback_index.h" | 10 #include "rollback_index.h" |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 for (i = 0; i < 2; i++) { | 109 for (i = 0; i < 2; i++) { |
| 110 VbKeyBlockHeader* key_block; | 110 VbKeyBlockHeader* key_block; |
| 111 uint64_t vblock_size; | 111 uint64_t vblock_size; |
| 112 VbFirmwarePreambleHeader* preamble; | 112 VbFirmwarePreambleHeader* preamble; |
| 113 RSAPublicKey* data_key; | 113 RSAPublicKey* data_key; |
| 114 uint64_t key_version; | 114 uint64_t key_version; |
| 115 uint64_t combined_version; | 115 uint64_t combined_version; |
| 116 uint8_t* body_digest; | 116 uint8_t* body_digest; |
| 117 | 117 |
| 118 /* If try B count is non-zero try firmware B first */ | 118 /* If try B count is non-zero try firmware B first */ |
| 119 index = (try_b_count ? i : 1 - i); | 119 index = (try_b_count ? 1 - i : i); |
| 120 | |
| 121 /* Verify the key block */ | |
| 122 VBPERFSTART("VB_VKB"); | |
| 123 if (0 == index) { | 120 if (0 == index) { |
| 124 key_block = (VbKeyBlockHeader*)params->verification_block_0; | 121 key_block = (VbKeyBlockHeader*)params->verification_block_0; |
| 125 vblock_size = params->verification_size_0; | 122 vblock_size = params->verification_size_0; |
| 126 } else { | 123 } else { |
| 127 key_block = (VbKeyBlockHeader*)params->verification_block_1; | 124 key_block = (VbKeyBlockHeader*)params->verification_block_1; |
| 128 vblock_size = params->verification_size_1; | 125 vblock_size = params->verification_size_1; |
| 129 } | 126 } |
| 130 if ((0 != KeyBlockVerify(key_block, vblock_size, root_key, 0))) { | |
| 131 VBDEBUG(("Key block verification failed.\n")); | |
| 132 VBPERFEND("VB_VKB"); | |
| 133 continue; | |
| 134 } | |
| 135 VBPERFEND("VB_VKB"); | |
| 136 | 127 |
| 137 /* Check the key block flags against the current boot mode. */ | 128 /* Check the key block flags against the current boot mode. Do this |
| 129 * before verifying the key block, since flags are faster to check than |
| 130 * the RSA signature. */ |
| 138 if (!(key_block->key_block_flags & | 131 if (!(key_block->key_block_flags & |
| 139 (is_dev ? KEY_BLOCK_FLAG_DEVELOPER_1 : | 132 (is_dev ? KEY_BLOCK_FLAG_DEVELOPER_1 : |
| 140 KEY_BLOCK_FLAG_DEVELOPER_0))) { | 133 KEY_BLOCK_FLAG_DEVELOPER_0))) { |
| 141 VBDEBUG(("Developer flag mismatch.\n")); | 134 VBDEBUG(("Developer flag mismatch.\n")); |
| 142 continue; | 135 continue; |
| 143 } | 136 } |
| 144 /* RW firmware never runs in recovery mode. */ | 137 /* RW firmware never runs in recovery mode. */ |
| 145 if (!(key_block->key_block_flags & KEY_BLOCK_FLAG_RECOVERY_0)) { | 138 if (!(key_block->key_block_flags & KEY_BLOCK_FLAG_RECOVERY_0)) { |
| 146 VBDEBUG(("Recovery flag mismatch.\n")); | 139 VBDEBUG(("Recovery flag mismatch.\n")); |
| 147 continue; | 140 continue; |
| 148 } | 141 } |
| 149 | 142 |
| 143 /* Verify the key block */ |
| 144 VBPERFSTART("VB_VKB"); |
| 145 if ((0 != KeyBlockVerify(key_block, vblock_size, root_key, 0))) { |
| 146 VBDEBUG(("Key block verification failed.\n")); |
| 147 VBPERFEND("VB_VKB"); |
| 148 continue; |
| 149 } |
| 150 VBPERFEND("VB_VKB"); |
| 151 |
| 150 /* Check for rollback of key version. */ | 152 /* Check for rollback of key version. */ |
| 151 key_version = key_block->data_key.key_version; | 153 key_version = key_block->data_key.key_version; |
| 152 if (key_version < (tpm_version >> 16)) { | 154 if (key_version < (tpm_version >> 16)) { |
| 153 VBDEBUG(("Key rollback detected.\n")); | 155 VBDEBUG(("Key rollback detected.\n")); |
| 154 continue; | 156 continue; |
| 155 } | 157 } |
| 156 | 158 |
| 157 /* Get the key for preamble/data verification from the key block. */ | 159 /* Get the key for preamble/data verification from the key block. */ |
| 158 data_key = PublicKeyToRSA(&key_block->data_key); | 160 data_key = PublicKeyToRSA(&key_block->data_key); |
| 159 if (!data_key) { | 161 if (!data_key) { |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 uint32_t status = RollbackS3Resume(); | 323 uint32_t status = RollbackS3Resume(); |
| 322 | 324 |
| 323 /* If we can't resume, just do a full reboot. No need to go to recovery | 325 /* If we can't resume, just do a full reboot. No need to go to recovery |
| 324 * mode here, since if the TPM is really broken we'll catch it on the | 326 * mode here, since if the TPM is really broken we'll catch it on the |
| 325 * next boot. */ | 327 * next boot. */ |
| 326 if (status == TPM_SUCCESS) | 328 if (status == TPM_SUCCESS) |
| 327 return LOAD_FIRMWARE_SUCCESS; | 329 return LOAD_FIRMWARE_SUCCESS; |
| 328 else | 330 else |
| 329 return LOAD_FIRMWARE_REBOOT; | 331 return LOAD_FIRMWARE_REBOOT; |
| 330 } | 332 } |
| OLD | NEW |