| 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 loading a kernel from disk. | 5 * Functions for loading a kernel from disk. |
| 6 * (Firmware portion) | 6 * (Firmware portion) |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "vboot_kernel.h" | 9 #include "vboot_kernel.h" |
| 10 | 10 |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 if (0 != BootDeviceReadLBA(part_start, kbuf_sectors, kbuf)) | 204 if (0 != BootDeviceReadLBA(part_start, kbuf_sectors, kbuf)) |
| 205 continue; | 205 continue; |
| 206 | 206 |
| 207 /* Verify the key block */ | 207 /* Verify the key block */ |
| 208 key_block = (VbKeyBlockHeader*)kbuf; | 208 key_block = (VbKeyBlockHeader*)kbuf; |
| 209 if ((0 != KeyBlockVerify(key_block, KBUF_SIZE, kernel_subkey))) { | 209 if ((0 != KeyBlockVerify(key_block, KBUF_SIZE, kernel_subkey))) { |
| 210 VBDEBUG(("Verifying key block failed.\n")); | 210 VBDEBUG(("Verifying key block failed.\n")); |
| 211 continue; | 211 continue; |
| 212 } | 212 } |
| 213 | 213 |
| 214 /* Check the key block flags against the current boot mode */ | 214 /* Check the key block flags against the current boot mode in normal |
| 215 if (!(key_block->key_block_flags & | 215 * and recovery modes (not in developer mode booting from SSD). */ |
| 216 (is_dev ? KEY_BLOCK_FLAG_DEVELOPER_1 : | 216 if (is_rec || is_normal) { |
| 217 KEY_BLOCK_FLAG_DEVELOPER_0))) { | 217 if (!(key_block->key_block_flags & |
| 218 VBDEBUG(("Developer flag mismatch.\n")); | 218 (is_dev ? KEY_BLOCK_FLAG_DEVELOPER_1 : |
| 219 continue; | 219 KEY_BLOCK_FLAG_DEVELOPER_0))) { |
| 220 } | 220 VBDEBUG(("Developer flag mismatch.\n")); |
| 221 if (!(key_block->key_block_flags & | 221 continue; |
| 222 (is_rec ? KEY_BLOCK_FLAG_RECOVERY_1 : | 222 } |
| 223 KEY_BLOCK_FLAG_RECOVERY_0))) { | 223 if (!(key_block->key_block_flags & |
| 224 VBDEBUG(("Recovery flag mismatch.\n")); | 224 (is_rec ? KEY_BLOCK_FLAG_RECOVERY_1 : |
| 225 continue; | 225 KEY_BLOCK_FLAG_RECOVERY_0))) { |
| 226 VBDEBUG(("Recovery flag mismatch.\n")); |
| 227 continue; |
| 228 } |
| 226 } | 229 } |
| 227 | 230 |
| 228 /* Check for rollback of key version. Note this is implicitly | 231 /* Check for rollback of key version. Note this is implicitly |
| 229 * skipped in recovery and developer modes because those set | 232 * skipped in recovery and developer modes because those set |
| 230 * key_version=0 above. */ | 233 * key_version=0 above. */ |
| 231 key_version = key_block->data_key.key_version; | 234 key_version = key_block->data_key.key_version; |
| 232 if (key_version < tpm_key_version) { | 235 if (key_version < tpm_key_version) { |
| 233 VBDEBUG(("Key version too old.\n")); | 236 VBDEBUG(("Key version too old.\n")); |
| 234 continue; | 237 continue; |
| 235 } | 238 } |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 /* Success! */ | 406 /* Success! */ |
| 404 return LOAD_KERNEL_SUCCESS; | 407 return LOAD_KERNEL_SUCCESS; |
| 405 } | 408 } |
| 406 | 409 |
| 407 // Handle error cases | 410 // Handle error cases |
| 408 if (found_partitions) | 411 if (found_partitions) |
| 409 return LOAD_KERNEL_INVALID; | 412 return LOAD_KERNEL_INVALID; |
| 410 else | 413 else |
| 411 return LOAD_KERNEL_NOT_FOUND; | 414 return LOAD_KERNEL_NOT_FOUND; |
| 412 } | 415 } |
| OLD | NEW |