Index: vkernel/load_kernel_fw.c |
diff --git a/vkernel/load_kernel_fw.c b/vkernel/load_kernel_fw.c |
deleted file mode 100644 |
index a135628e72e7937b1746af15506ca95dedf22764..0000000000000000000000000000000000000000 |
--- a/vkernel/load_kernel_fw.c |
+++ /dev/null |
@@ -1,251 +0,0 @@ |
-/* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- * |
- * Functions for loading a kernel from disk. |
- * (Firmware portion) |
- */ |
- |
-#include "load_kernel_fw.h" |
- |
-#include "boot_device.h" |
-#include "cgptlib.h" |
-#include "kernel_image_fw.h" |
-#include "rollback_index.h" |
-#include "utility.h" |
-#include "vboot_kernel.h" |
- |
-#define GPT_ENTRIES_SIZE 16384 /* Bytes to read for GPT entries */ |
- |
-#ifdef PRINT_DEBUG_INFO |
-// TODO: for testing |
-#include <stdio.h> |
-#include <inttypes.h> /* For PRIu64 macro */ |
-#include "cgptlib_internal.h" |
-#endif |
- |
- |
-#define KBUF_SIZE 65536 /* Bytes to read at start of kernel partition */ |
- |
-int LoadKernelOld(LoadKernelParams* params) { |
- |
- GptData gpt; |
- uint64_t part_start, part_size; |
- uint64_t blba = params->bytes_per_lba; |
- uint8_t* kbuf = NULL; |
- uint64_t kbuf_sectors; |
- int found_partition = 0; |
- int good_partition = -1; |
- uint16_t tpm_kernel_key_version, tpm_kernel_version; |
- uint16_t lowest_kernel_key_version = 0xFFFF; |
- uint16_t lowest_kernel_version = 0xFFFF; |
- KernelImage *kim = NULL; |
- int is_dev = ((BOOT_FLAG_DEVELOPER & params->boot_flags) && |
- !(BOOT_FLAG_RECOVERY & params->boot_flags)); |
- int is_normal = (!(BOOT_FLAG_DEVELOPER & params->boot_flags) && |
- !(BOOT_FLAG_RECOVERY & params->boot_flags)); |
- |
- /* Clear output params in case we fail */ |
- params->partition_number = 0; |
- params->bootloader_address = 0; |
- params->bootloader_size = 0; |
- |
- if (is_normal) { |
- /* Read current kernel key index from TPM. Assumes TPM is already |
- * initialized. */ |
- if (0 != GetStoredVersions(KERNEL_VERSIONS, |
- &tpm_kernel_key_version, |
- &tpm_kernel_version)) |
- return LOAD_KERNEL_RECOVERY; |
- } |
- |
- do { |
- /* Read GPT data */ |
- gpt.sector_bytes = blba; |
- gpt.drive_sectors = params->ending_lba + 1; |
- if (0 != AllocAndReadGptData(&gpt)) |
- break; |
- |
- /* Initialize GPT library */ |
- if (GPT_SUCCESS != GptInit(&gpt)) |
- break; |
- |
- /* Allocate kernel header and image work buffers */ |
- kbuf = (uint8_t*)Malloc(KBUF_SIZE); |
- if (!kbuf) |
- break; |
- |
- kbuf_sectors = KBUF_SIZE / blba; |
- kim = (KernelImage*)Malloc(sizeof(KernelImage)); |
- if (!kim) |
- break; |
- |
- /* Loop over candidate kernel partitions */ |
- while (GPT_SUCCESS == GptNextKernelEntry(&gpt, &part_start, &part_size)) { |
- RSAPublicKey *kernel_sign_key = NULL; |
- int kernel_start, kernel_sectors; |
- |
- /* Found at least one kernel partition. */ |
- found_partition = 1; |
- |
- /* Read the first part of the kernel partition */ |
- if (part_size < kbuf_sectors) |
- continue; |
- if (0 != BootDeviceReadLBA(part_start, kbuf_sectors, kbuf)) |
- continue; |
- |
- /* Verify the kernel header and preamble */ |
- if (VERIFY_KERNEL_SUCCESS != VerifyKernelHeader( |
- params->header_sign_key_blob, |
- kbuf, |
- KBUF_SIZE, |
- (is_dev ? 1 : 0), |
- kim, |
- &kernel_sign_key)) { |
- continue; |
- } |
- |
-#ifdef PRINT_DEBUG_INFO |
- printf("Kernel header:\n"); |
- printf("header version: %d\n", kim->header_version); |
- printf("header len: %d\n", kim->header_len); |
- printf("firmware sign alg: %d\n", kim->firmware_sign_algorithm); |
- printf("kernel sign alg: %d\n", kim->kernel_sign_algorithm); |
- printf("kernel key version: %d\n", kim->kernel_key_version); |
- printf("kernel version: %d\n", kim->kernel_version); |
- printf("kernel len: %" PRIu64 "\n", kim->kernel_len); |
- printf("bootloader addr: %" PRIu64 "\n", kim->bootloader_offset); |
- printf("bootloader size: %" PRIu64 "\n", kim->bootloader_size); |
- printf("padded header size: %" PRIu64 "\n", kim->padded_header_size); |
-#endif |
- |
- /* Check for rollback of key version */ |
- if (kim->kernel_key_version < tpm_kernel_key_version) { |
- RSAPublicKeyFree(kernel_sign_key); |
- continue; |
- } |
- |
- /* Check for rollback of kernel version */ |
- if (kim->kernel_key_version == tpm_kernel_key_version && |
- kim->kernel_version < tpm_kernel_version) { |
- RSAPublicKeyFree(kernel_sign_key); |
- continue; |
- } |
- |
- /* Check for lowest key version from a valid header. */ |
- if (lowest_kernel_key_version > kim->kernel_key_version) { |
- lowest_kernel_key_version = kim->kernel_key_version; |
- lowest_kernel_version = kim->kernel_version; |
- } |
- else if (lowest_kernel_key_version == kim->kernel_key_version && |
- lowest_kernel_version > kim->kernel_version) { |
- lowest_kernel_version = kim->kernel_version; |
- } |
- |
- /* If we already have a good kernel, no need to read another |
- * one; we only needed to look at the versions to check for |
- * rollback. */ |
- if (-1 != good_partition) |
- continue; |
- |
- /* Verify kernel padding is a multiple of sector size. */ |
- if (0 != kim->padded_header_size % blba) { |
- RSAPublicKeyFree(kernel_sign_key); |
- continue; |
- } |
- |
- kernel_start = part_start + (kim->padded_header_size / blba); |
- kernel_sectors = (kim->kernel_len + blba - 1) / blba; |
- |
- /* Read the kernel data */ |
- if (0 != BootDeviceReadLBA(kernel_start, kernel_sectors, |
- params->kernel_buffer)) { |
- RSAPublicKeyFree(kernel_sign_key); |
- continue; |
- } |
- |
- /* Verify kernel data */ |
- if (0 != VerifyKernelData(kernel_sign_key, |
- kim->kernel_signature, |
- params->kernel_buffer, |
- kim->kernel_len, |
- kim->kernel_sign_algorithm)) { |
- RSAPublicKeyFree(kernel_sign_key); |
- continue; |
- } |
- |
- /* Done with the kernel signing key, so can free it now */ |
- RSAPublicKeyFree(kernel_sign_key); |
- |
- /* If we're still here, the kernel is valid. */ |
- /* Save the first good partition we find; that's the one we'll boot */ |
- if (-1 == good_partition) { |
- good_partition = gpt.current_kernel; |
- params->partition_number = gpt.current_kernel; |
- params->bootloader_address = kim->bootloader_offset; |
- params->bootloader_size = kim->bootloader_size; |
- |
- /* If we're in developer or recovery mode, there's no rollback |
- * protection, so we can stop at the first valid kernel. */ |
- if (!is_normal) |
- break; |
- |
- /* Otherwise, we're in normal boot mode, so we do care about |
- * the key index in the TPM. If the good partition's key |
- * version is the same as the tpm, then the TPM doesn't need |
- * updating; we can stop now. Otherwise, we'll check all the |
- * other headers to see if they contain a newer key. */ |
- if (kim->kernel_key_version == tpm_kernel_key_version && |
- kim->kernel_version == tpm_kernel_version) |
- break; |
- } |
- } /* while(GptNextKernelEntry) */ |
- } while(0); |
- |
- /* Free kernel work and image buffers */ |
- if (kbuf) |
- Free(kbuf); |
- if (kim) |
- Free(kim); |
- |
- /* Write and free GPT data */ |
- WriteAndFreeGptData(&gpt); |
- |
- /* Handle finding a good partition */ |
- if (good_partition >= 0) { |
- |
- if (is_normal) { |
- /* See if we need to update the TPM, for normal boot mode only. */ |
- if ((lowest_kernel_key_version > tpm_kernel_key_version) || |
- (lowest_kernel_key_version == tpm_kernel_key_version && |
- lowest_kernel_version > tpm_kernel_version)) { |
- if (0 != WriteStoredVersions(KERNEL_VERSIONS, |
- lowest_kernel_key_version, |
- lowest_kernel_version)) |
- return LOAD_KERNEL_RECOVERY; |
- } |
- } |
- |
- if (!(BOOT_FLAG_RECOVERY & params->boot_flags)) { |
- /* We can lock the TPM now, since we've decided which kernel we |
- * like. If we don't find a good kernel, we leave the TPM |
- * unlocked so we can try again on the next boot device. If no |
- * kernels are good, we'll reboot to recovery mode, so it's ok to |
- * leave the TPM unlocked in that case too. |
- * |
- * If we're already in recovery mode, we need to leave PP unlocked, |
- * so don't lock the kernel versions. */ |
- if (0 != LockKernelVersionsByLockingPP()) |
- return LOAD_KERNEL_RECOVERY; |
- } |
- |
- /* Success! */ |
- return LOAD_KERNEL_SUCCESS; |
- } |
- |
- /* Handle error cases */ |
- if (found_partition) |
- return LOAD_KERNEL_INVALID; |
- else |
- return LOAD_KERNEL_NOT_FOUND; |
-} |