summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Kitching <kitching@google.com>2019-08-22 12:50:44 +0800
committerCommit Bot <commit-bot@chromium.org>2019-08-27 04:33:46 +0000
commitb1329fe473dafd7910a8bd9c58d4e777eddd9fb3 (patch)
treef873ee3aefb07a828e389b09b5696ff81383fa71
parentce8b8a06dd94bece219fba2cc504a504f07c6458 (diff)
downloadvboot-b1329fe473dafd7910a8bd9c58d4e777eddd9fb3.tar.gz
vboot: bring load_kernel_test up to coding style standards
In case we want to keep it around. See b:139839429. BUG=b:124141368, b:139839429 TEST=None BRANCH=none Change-Id: Ib49a8c7a1acf2e643fcda0a68bf39d756506e3a2 Signed-off-by: Joel Kitching <kitching@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/1763971 Tested-by: Joel Kitching <kitching@chromium.org> Commit-Queue: Joel Kitching <kitching@chromium.org> Reviewed-by: Mike Frysinger <vapier@chromium.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
-rw-r--r--utility/load_kernel_test.c483
1 files changed, 243 insertions, 240 deletions
diff --git a/utility/load_kernel_test.c b/utility/load_kernel_test.c
index ba3ab89b..b8f54315 100644
--- a/utility/load_kernel_test.c
+++ b/utility/load_kernel_test.c
@@ -1,16 +1,12 @@
/* Copyright (c) 2011 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.
- */
-
-/* Routines for verifying a file's signature. Useful in testing the core
+ *
+ * Routines for verifying a file's signature. Useful in testing the core
* RSA verification implementation.
*/
-#include <inttypes.h> /* For PRIu64 macro */
#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
#include <sys/types.h>
#include <unistd.h>
@@ -33,45 +29,52 @@ static FILE *image_file = NULL;
/* Boot device stub implementations to read from the image file */
vb2_error_t VbExDiskRead(VbExDiskHandle_t handle, uint64_t lba_start,
- uint64_t lba_count, void *buffer) {
- printf("Read(%" PRIu64 ", %" PRIu64 ")\n", lba_start, lba_count);
-
- if (lba_start >= lkp.streaming_lba_count ||
- lba_start + lba_count > lkp.streaming_lba_count) {
- fprintf(stderr, "Read overrun: %" PRIu64 " + %" PRIu64 " > %" PRIu64 "\n",
- lba_start, lba_count, lkp.streaming_lba_count);
- return 1;
- }
-
- if (0 != fseek(image_file, lba_start * lkp.bytes_per_lba, SEEK_SET) ||
- 1 != fread(buffer, lba_count * lkp.bytes_per_lba, 1, image_file)) {
- fprintf(stderr, "Read error.");
- return 1;
- }
- return VB2_SUCCESS;
+ uint64_t lba_count, void *buffer)
+{
+ printf("Read(%" PRIu64 ", %" PRIu64 ")\n", lba_start, lba_count);
+
+ if (lba_start >= lkp.streaming_lba_count ||
+ lba_start + lba_count > lkp.streaming_lba_count) {
+ fprintf(stderr,
+ "Read overrun: %" PRIu64 " + %" PRIu64
+ " > %" PRIu64 "\n", lba_start,
+ lba_count, lkp.streaming_lba_count);
+ return 1;
+ }
+
+ if (0 != fseek(image_file, lba_start * lkp.bytes_per_lba, SEEK_SET) ||
+ 1 != fread(buffer, lba_count * lkp.bytes_per_lba, 1, image_file)) {
+ fprintf(stderr, "Read error.");
+ return 1;
+ }
+ return VB2_SUCCESS;
}
vb2_error_t VbExDiskWrite(VbExDiskHandle_t handle, uint64_t lba_start,
- uint64_t lba_count, const void *buffer) {
- printf("Write(%" PRIu64 ", %" PRIu64 ")\n", lba_start, lba_count);
-
- if (lba_start >= lkp.streaming_lba_count ||
- lba_start + lba_count > lkp.streaming_lba_count) {
- fprintf(stderr, "Read overrun: %" PRIu64 " + %" PRIu64 " > %" PRIu64 "\n",
- lba_start, lba_count, lkp.streaming_lba_count);
- return 1;
- }
-
- /* TODO: enable writes, once we're sure it won't trash our example file */
- return VB2_SUCCESS;
-
- fseek(image_file, lba_start * lkp.bytes_per_lba, SEEK_SET);
- if (1 != fwrite(buffer, lba_count * lkp.bytes_per_lba, 1, image_file)) {
- fprintf(stderr, "Read error.");
- return 1;
- }
- return VB2_SUCCESS;
+ uint64_t lba_count, const void *buffer)
+{
+ printf("Write(%" PRIu64 ", %" PRIu64 ")\n", lba_start, lba_count);
+
+ if (lba_start >= lkp.streaming_lba_count ||
+ lba_start + lba_count > lkp.streaming_lba_count) {
+ fprintf(stderr,
+ "Read overrun: %" PRIu64 " + %" PRIu64
+ " > %" PRIu64 "\n", lba_start, lba_count,
+ lkp.streaming_lba_count);
+ return 1;
+ }
+
+ /* TODO: enable writes, once we're sure it won't trash
+ our example file */
+ return VB2_SUCCESS;
+
+ fseek(image_file, lba_start * lkp.bytes_per_lba, SEEK_SET);
+ if (1 != fwrite(buffer, lba_count * lkp.bytes_per_lba, 1, image_file)) {
+ fprintf(stderr, "Read error.");
+ return 1;
+ }
+ return VB2_SUCCESS;
}
@@ -79,203 +82,203 @@ vb2_error_t VbExDiskWrite(VbExDiskHandle_t handle, uint64_t lba_start,
#define BOOT_FLAG_RECOVERY (1 << 1)
/* Main routine */
-int main(int argc, char* argv[]) {
-
- const char* image_name;
- uint64_t key_size = 0;
- uint8_t* key_blob = NULL;
- VbSharedDataHeader* shared;
- struct vb2_gbb_header* gbb;
- vb2_error_t rv;
- int c, argsleft;
- int errorcnt = 0;
- char *e = 0;
-
- memset(&lkp, 0, sizeof(LoadKernelParams));
- lkp.bytes_per_lba = LBA_BYTES;
- int boot_flags = BOOT_FLAG_RECOVERY;
-
- /* Parse options */
- opterr = 0;
- while ((c=getopt(argc, argv, ":b:")) != -1)
- {
- switch (c)
- {
- case 'b':
- boot_flags = strtoull(optarg, &e, 0);
- if (!*optarg || (e && *e))
- {
- fprintf(stderr, "Invalid argument to -%c: \"%s\"\n", c, optarg);
- errorcnt++;
- }
- break;
- case '?':
- fprintf(stderr, "Unrecognized switch: -%c\n", optopt);
- errorcnt++;
- break;
- case ':':
- fprintf(stderr, "Missing argument to -%c\n", optopt);
- errorcnt++;
- break;
- default:
- errorcnt++;
- break;
- }
- }
-
- /* Update argc */
- argsleft = argc - optind;
-
- if (errorcnt || !argsleft)
- {
- fprintf(stderr, "usage: %s [options] <drive_image> [<sign_key>]\n",
- argv[0]);
- fprintf(stderr, "\noptions:\n");
- /* These cases are because uint64_t isn't necessarily the same as ULL. */
- fprintf(stderr, " -b NUM boot flag bits (default %d):\n",
- BOOT_FLAG_RECOVERY);
- fprintf(stderr, " %d = developer mode on\n",
- BOOT_FLAG_DEVELOPER);
- fprintf(stderr, " %d = recovery mode on\n",
- BOOT_FLAG_RECOVERY);
- return 1;
- }
-
- image_name = argv[optind];
-
- /* Read header signing key blob */
- if (argsleft > 1) {
- key_blob = ReadFile(argv[optind+1], &key_size);
- if (!key_blob) {
- fprintf(stderr, "Unable to read key file %s\n", argv[optind+1]);
- return 1;
- }
- printf("Read %" PRIu64 " bytes of key from %s\n", key_size, argv[optind+1]);
- if (key_size > 16*1024*1024) {
- fprintf(stderr, "Key blob size=%" PRIu64 " is ridiculous.\n", key_size);
- free(key_blob);
- return 1;
- }
- }
-
- /* Initialize the GBB */
- uint32_t gbb_size = sizeof(struct vb2_gbb_header) + key_size;
- gbb = (struct vb2_gbb_header*)malloc(gbb_size);
- memset(gbb, 0, gbb_size);
- memcpy(gbb->signature, VB2_GBB_SIGNATURE, VB2_GBB_SIGNATURE_SIZE);
- gbb->major_version = VB2_GBB_MAJOR_VER;
- gbb->minor_version = VB2_GBB_MINOR_VER;
- gbb->header_size = sizeof(struct vb2_gbb_header);
- /* Fill in the given key, if any, for both root and recovery */
- if (key_blob) {
- gbb->rootkey_offset = gbb->header_size;
- gbb->rootkey_size = key_size;
- memcpy((uint8_t*)gbb + gbb->rootkey_offset, key_blob, key_size);
-
- gbb->recovery_key_offset = gbb->rootkey_offset;
- gbb->recovery_key_size = key_size;
- }
-
- /* Initialize the shared data area */
- shared = (VbSharedDataHeader*)malloc(VB_SHARED_DATA_REC_SIZE);
- if (0 != VbSharedDataInit(shared, VB_SHARED_DATA_REC_SIZE)) {
- fprintf(stderr, "Unable to init shared data\n");
- return 1;
- }
- /* Copy in the key blob, if any */
- if (key_blob) {
- if (0 != VbSharedDataSetKernelKey(shared,
- (struct vb2_packed_key *)key_blob)) {
- fprintf(stderr, "Unable to set key in shared data\n");
- return 1;
- }
- }
-
- /* Free the key blob, now that we're done with it */
- free(key_blob);
-
- printf("bootflags = %d\n", boot_flags);
- lkp.boot_flags = boot_flags;
-
- /* Get image size */
- printf("Reading from image: %s\n", image_name);
- image_file = fopen(image_name, "rb");
- if (!image_file) {
- fprintf(stderr, "Unable to open image file %s\n", image_name);
- return 1;
- }
- fseek(image_file, 0, SEEK_END);
- lkp.streaming_lba_count = (ftell(image_file) / LBA_BYTES);
- lkp.gpt_lba_count = lkp.streaming_lba_count;
- rewind(image_file);
- printf("Streaming LBA count: %" PRIu64 "\n", lkp.streaming_lba_count);
-
- /* Allocate a buffer for the kernel */
- lkp.kernel_buffer = malloc(KERNEL_BUFFER_SIZE);
- if(!lkp.kernel_buffer) {
- fprintf(stderr, "Unable to allocate kernel buffer.\n");
- return 1;
- }
- lkp.kernel_buffer_size = KERNEL_BUFFER_SIZE;
-
- /*
- * Set up vboot context.
- *
- * TODO: Propagate this up to higher API levels
- */
- struct vb2_context ctx;
- memset(&ctx, 0, sizeof(ctx));
- /* No need to initialize ctx->nvdata[]; defaults are fine */
- /* TODO(chromium:441893): support dev-mode flag and external gpt flag */
- ctx.workbuf = malloc(VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE);
- if (!ctx.workbuf) {
- fprintf(stderr, "Can't allocate workbuf\n");
- return 1;
- }
- ctx.workbuf_size = VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE;
- if (boot_flags & BOOT_FLAG_RECOVERY)
- ctx.flags |= VB2_CONTEXT_RECOVERY_MODE;
- if (boot_flags & BOOT_FLAG_DEVELOPER)
- ctx.flags |= VB2_CONTEXT_DEVELOPER_MODE;
- if (VB2_SUCCESS != vb2_init_context(&ctx)) {
- free(ctx.workbuf);
- fprintf(stderr, "Can't init context\n");
- return 1;
- }
-
- struct vb2_shared_data *sd = vb2_get_sd(&ctx);
- sd->vbsd = shared;
-
- /* Call LoadKernel() */
- rv = LoadKernel(&ctx, &lkp);
- printf("LoadKernel() returned %d\n", rv);
-
- if (VB2_SUCCESS == rv) {
- printf("Partition number: %u\n", lkp.partition_number);
- printf("Bootloader address: %" PRIu64 "\n", lkp.bootloader_address);
- printf("Bootloader size: %u\n", lkp.bootloader_size);
- printf("Partition guid: "
- "%02x%02x%02x%02x-%02x%02x-%02x%02x"
- "-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
- lkp.partition_guid[3],
- lkp.partition_guid[2],
- lkp.partition_guid[1],
- lkp.partition_guid[0],
- lkp.partition_guid[5],
- lkp.partition_guid[4],
- lkp.partition_guid[7],
- lkp.partition_guid[6],
- lkp.partition_guid[8],
- lkp.partition_guid[9],
- lkp.partition_guid[10],
- lkp.partition_guid[11],
- lkp.partition_guid[12],
- lkp.partition_guid[13],
- lkp.partition_guid[14],
- lkp.partition_guid[15]);
- }
-
- fclose(image_file);
- free(lkp.kernel_buffer);
- return rv != VB2_SUCCESS;
+int main(int argc, char* argv[])
+{
+ const char* image_name;
+ uint64_t key_size = 0;
+ uint8_t* key_blob = NULL;
+ VbSharedDataHeader* shared;
+ struct vb2_gbb_header* gbb;
+ vb2_error_t rv;
+ int c, argsleft;
+ int errorcnt = 0;
+ char *e = 0;
+
+ memset(&lkp, 0, sizeof(LoadKernelParams));
+ lkp.bytes_per_lba = LBA_BYTES;
+ int boot_flags = BOOT_FLAG_RECOVERY;
+
+ /* Parse options */
+ opterr = 0;
+ while ((c = getopt(argc, argv, ":b:")) != -1) {
+ switch (c) {
+ case 'b':
+ boot_flags = strtoull(optarg, &e, 0);
+ if (!*optarg || (e && *e)) {
+ fprintf(stderr,
+ "Invalid argument to -%c: \"%s\"\n",
+ c, optarg);
+ errorcnt++;
+ }
+ break;
+ case '?':
+ fprintf(stderr, "Unrecognized switch: -%c\n", optopt);
+ errorcnt++;
+ break;
+ case ':':
+ fprintf(stderr, "Missing argument to -%c\n", optopt);
+ errorcnt++;
+ break;
+ default:
+ errorcnt++;
+ break;
+ }
+ }
+
+ /* Update argc */
+ argsleft = argc - optind;
+
+ if (errorcnt || !argsleft) {
+ fprintf(stderr,
+ "usage: %s [options] <drive_image> [<sign_key>]\n",
+ argv[0]);
+ fprintf(stderr, "\noptions:\n");
+ /* These cases are because uint64_t isn't necessarily the same
+ as ULL. */
+ fprintf(stderr, " -b NUM boot flag bits (default %d):\n",
+ BOOT_FLAG_RECOVERY);
+ fprintf(stderr, " %d = developer mode on\n",
+ BOOT_FLAG_DEVELOPER);
+ fprintf(stderr, " %d = recovery mode on\n",
+ BOOT_FLAG_RECOVERY);
+ return 1;
+ }
+
+ image_name = argv[optind];
+
+ /* Read header signing key blob */
+ if (argsleft > 1) {
+ key_blob = ReadFile(argv[optind+1], &key_size);
+ if (!key_blob) {
+ fprintf(stderr, "Unable to read key file %s\n",
+ argv[optind+1]);
+ return 1;
+ }
+ printf("Read %" PRIu64 " bytes of key from %s\n", key_size,
+ argv[optind+1]);
+ if (key_size > 16*1024*1024) {
+ fprintf(stderr, "Key blob size=%" PRIu64
+ " is ridiculous.\n", key_size);
+ free(key_blob);
+ return 1;
+ }
+ }
+
+ /* Initialize the GBB */
+ uint32_t gbb_size = sizeof(struct vb2_gbb_header) + key_size;
+ gbb = (struct vb2_gbb_header*)malloc(gbb_size);
+ memset(gbb, 0, gbb_size);
+ memcpy(gbb->signature, VB2_GBB_SIGNATURE, VB2_GBB_SIGNATURE_SIZE);
+ gbb->major_version = VB2_GBB_MAJOR_VER;
+ gbb->minor_version = VB2_GBB_MINOR_VER;
+ gbb->header_size = sizeof(struct vb2_gbb_header);
+ /* Fill in the given key, if any, for both root and recovery */
+ if (key_blob) {
+ gbb->rootkey_offset = gbb->header_size;
+ gbb->rootkey_size = key_size;
+ memcpy((uint8_t*)gbb + gbb->rootkey_offset, key_blob, key_size);
+
+ gbb->recovery_key_offset = gbb->rootkey_offset;
+ gbb->recovery_key_size = key_size;
+ }
+
+ /* Initialize the shared data area */
+ shared = (VbSharedDataHeader*)malloc(VB_SHARED_DATA_REC_SIZE);
+ if (0 != VbSharedDataInit(shared, VB_SHARED_DATA_REC_SIZE)) {
+ fprintf(stderr, "Unable to init shared data\n");
+ return 1;
+ }
+ /* Copy in the key blob, if any */
+ if (key_blob) {
+ if (0 != VbSharedDataSetKernelKey(
+ shared, (struct vb2_packed_key *)key_blob)) {
+ fprintf(stderr, "Unable to set key in shared data\n");
+ return 1;
+ }
+ }
+
+ /* Free the key blob, now that we're done with it */
+ free(key_blob);
+
+ printf("bootflags = %d\n", boot_flags);
+ lkp.boot_flags = boot_flags;
+
+ /* Get image size */
+ printf("Reading from image: %s\n", image_name);
+ image_file = fopen(image_name, "rb");
+ if (!image_file) {
+ fprintf(stderr, "Unable to open image file %s\n", image_name);
+ return 1;
+ }
+ fseek(image_file, 0, SEEK_END);
+ lkp.streaming_lba_count = (ftell(image_file) / LBA_BYTES);
+ lkp.gpt_lba_count = lkp.streaming_lba_count;
+ rewind(image_file);
+ printf("Streaming LBA count: %" PRIu64 "\n", lkp.streaming_lba_count);
+
+ /* Allocate a buffer for the kernel */
+ lkp.kernel_buffer = malloc(KERNEL_BUFFER_SIZE);
+ if(!lkp.kernel_buffer) {
+ fprintf(stderr, "Unable to allocate kernel buffer.\n");
+ return 1;
+ }
+ lkp.kernel_buffer_size = KERNEL_BUFFER_SIZE;
+
+ /* Set up vboot context. */
+ struct vb2_context ctx;
+ memset(&ctx, 0, sizeof(ctx));
+ /* No need to initialize ctx->nvdata[]; defaults are fine */
+ /* TODO(chromium:441893): support dev-mode flag and external gpt flag */
+ ctx.workbuf = malloc(VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE);
+ if (!ctx.workbuf) {
+ fprintf(stderr, "Can't allocate workbuf\n");
+ return 1;
+ }
+ ctx.workbuf_size = VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE;
+ if (boot_flags & BOOT_FLAG_RECOVERY)
+ ctx.flags |= VB2_CONTEXT_RECOVERY_MODE;
+ if (boot_flags & BOOT_FLAG_DEVELOPER)
+ ctx.flags |= VB2_CONTEXT_DEVELOPER_MODE;
+ if (VB2_SUCCESS != vb2_init_context(&ctx)) {
+ free(ctx.workbuf);
+ fprintf(stderr, "Can't init context\n");
+ return 1;
+ }
+
+ struct vb2_shared_data *sd = vb2_get_sd(&ctx);
+ sd->vbsd = shared;
+
+ /* Call LoadKernel() */
+ rv = LoadKernel(&ctx, &lkp);
+ printf("LoadKernel() returned %d\n", rv);
+
+ if (VB2_SUCCESS == rv) {
+ printf("Partition number: %u\n", lkp.partition_number);
+ printf("Bootloader address: %" PRIu64 "\n",
+ lkp.bootloader_address);
+ printf("Bootloader size: %u\n", lkp.bootloader_size);
+ printf("Partition guid: "
+ "%02x%02x%02x%02x-%02x%02x-%02x%02x"
+ "-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
+ lkp.partition_guid[3],
+ lkp.partition_guid[2],
+ lkp.partition_guid[1],
+ lkp.partition_guid[0],
+ lkp.partition_guid[5],
+ lkp.partition_guid[4],
+ lkp.partition_guid[7],
+ lkp.partition_guid[6],
+ lkp.partition_guid[8],
+ lkp.partition_guid[9],
+ lkp.partition_guid[10],
+ lkp.partition_guid[11],
+ lkp.partition_guid[12],
+ lkp.partition_guid[13],
+ lkp.partition_guid[14],
+ lkp.partition_guid[15]);
+ }
+
+ fclose(image_file);
+ free(lkp.kernel_buffer);
+ return rv != VB2_SUCCESS;
}