summaryrefslogtreecommitdiff
path: root/futility
diff options
context:
space:
mode:
authorBill Richardson <wfrichar@chromium.org>2015-01-27 13:59:35 -0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-01-28 11:13:58 +0000
commit5fb14634b9f7618592b9e88d9aa74b2111f15ee1 (patch)
tree6f75ab835a0229adf8ce216f732ac7f6bb70d4b3 /futility
parent40890c5cbb0b55dad12ff03873dff7789eb3f130 (diff)
downloadvboot-5fb14634b9f7618592b9e88d9aa74b2111f15ee1.tar.gz
futility: extract vb2_verify_fw to an external test
The vb2_verify_fw command is used only in a host-side test. It doesn't need to be built into futility. This makes it a separate executable used just for that test. BUG=chromium:231547 BRANCH=none TEST=make VBOOT2=1 runtests Note that tests/vb2_firmware_tests.sh still passes, now using an external vb2_verify_fw executable instead of a futility command. Change-Id: Iee58df065e7a762369c5e691f6c2093de9122ed2 Signed-off-by: Bill Richardson <wfrichar@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/243630
Diffstat (limited to 'futility')
-rw-r--r--futility/cmd_vb2_verify_fw.c216
1 files changed, 0 insertions, 216 deletions
diff --git a/futility/cmd_vb2_verify_fw.c b/futility/cmd_vb2_verify_fw.c
deleted file mode 100644
index 53079bb1..00000000
--- a/futility/cmd_vb2_verify_fw.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/* 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 firmware image's signature.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "2sysincludes.h"
-#include "2api.h"
-#include "futility.h"
-
-const char *gbb_fname;
-const char *vblock_fname;
-const char *body_fname;
-
-/**
- * Local implementation which reads resources from individual files. Could be
- * more elegant and read from bios.bin, if we understood the fmap.
- */
-int vb2ex_read_resource(struct vb2_context *ctx,
- enum vb2_resource_index index,
- uint32_t offset,
- void *buf,
- uint32_t size)
-{
- const char *fname;
- FILE *f;
- int got_size;
-
- /* Get the filename for the resource */
- switch (index) {
- case VB2_RES_GBB:
- fname = gbb_fname;
- break;
- case VB2_RES_FW_VBLOCK:
- fname = vblock_fname;
- break;
- default:
- return VB2_ERROR_UNKNOWN;
- }
-
- /* Open file and seek to the requested offset */
- f = fopen(fname, "rb");
- if (!f)
- return VB2_ERROR_UNKNOWN;
-
- if (fseek(f, offset, SEEK_SET)) {
- fclose(f);
- return VB2_ERROR_UNKNOWN;
- }
-
- /* Read data and close file */
- got_size = fread(buf, 1, size, f);
- fclose(f);
-
- /* Return success if we read everything */
- return got_size == size ? VB2_SUCCESS : VB2_ERROR_UNKNOWN;
-}
-
-int vb2ex_tpm_clear_owner(struct vb2_context *ctx)
-{
- // TODO: implement
- return VB2_SUCCESS;
-}
-
-/**
- * Save non-volatile and/or secure data if needed.
- */
-static void save_if_needed(struct vb2_context *ctx)
-{
-
- if (ctx->flags & VB2_CONTEXT_NVDATA_CHANGED) {
- // TODO: implement
- ctx->flags &= ~VB2_CONTEXT_NVDATA_CHANGED;
- }
-
- if (ctx->flags & VB2_CONTEXT_SECDATA_CHANGED) {
- // TODO: implement
- ctx->flags &= ~VB2_CONTEXT_SECDATA_CHANGED;
- }
-}
-
-/**
- * Verify firmware body
- */
-static int hash_body(struct vb2_context *ctx)
-{
- uint32_t expect_size;
- uint8_t block[8192];
- uint32_t size;
- FILE *f;
- int rv;
-
- /* Open the body data */
- f = fopen(body_fname, "rb");
-
- /* Start the body hash */
- rv = vb2api_init_hash(ctx, VB2_HASH_TAG_FW_BODY, &expect_size);
- if (rv)
- return rv;
-
- printf("Expect %d bytes of body...\n", expect_size);
-
- /* Extend over the body */
- while (expect_size) {
- size = sizeof(block);
- if (size > expect_size)
- size = expect_size;
-
- /* Read next body block */
- size = fread(block, 1, size, f);
- if (size <= 0)
- break;
-
- /* Hash it */
- rv = vb2api_extend_hash(ctx, block, size);
- if (rv)
- return rv;
-
- expect_size -= size;
- }
-
- /* Check the result */
- rv = vb2api_check_hash(ctx);
- if (rv)
- return rv;
-
- return VB2_SUCCESS;
-}
-
-static void print_help(const char *progname)
-{
- printf("Usage: %s <gbb> <vblock> <body>\n", progname);
-}
-
-static int do_vb2_verify_fw(int argc, char *argv[])
-{
- struct vb2_context ctx;
- uint8_t workbuf[16384] __attribute__ ((aligned (VB2_WORKBUF_ALIGN)));
- int rv;
-
- if (argc < 4) {
- print_help(argv[0]);
- return 1;
- }
-
- /* Save filenames */
- gbb_fname = argv[1];
- vblock_fname = argv[2];
- body_fname = argv[3];
-
- /* Set up context */
- memset(&ctx, 0, sizeof(ctx));
- ctx.workbuf = workbuf;
- ctx.workbuf_size = sizeof(workbuf);
-
- /* Initialize secure context */
- rv = vb2api_secdata_create(&ctx);
- if (rv) {
- fprintf(stderr,
- "error: vb2api_secdata_create() failed (%d)\n", rv);
- return 1;
- }
-
- // TODO: optional args to set contents for nvdata, secdata?
-
- /* Do early init */
- printf("Phase 1...\n");
- rv = vb2api_fw_phase1(&ctx);
- if (rv) {
- printf("Phase 1 wants recovery mode.\n");
- save_if_needed(&ctx);
- return rv;
- }
-
- /* Determine which firmware slot to boot */
- printf("Phase 2...\n");
- rv = vb2api_fw_phase2(&ctx);
- if (rv) {
- printf("Phase 2 wants reboot.\n");
- save_if_needed(&ctx);
- return rv;
- }
-
- /* Try that slot */
- printf("Phase 3...\n");
- rv = vb2api_fw_phase3(&ctx);
- if (rv) {
- printf("Phase 3 wants reboot.\n");
- save_if_needed(&ctx);
- return rv;
- }
-
- /* Verify body */
- printf("Hash body...\n");
- rv = hash_body(&ctx);
- save_if_needed(&ctx);
- if (rv) {
- printf("Phase 4 wants reboot.\n");
- return rv;
- }
-
- printf("Yaay!\n");
-
- printf("Workbuf used = %d bytes\n", ctx.workbuf_used);
-
- return 0;
-}
-
-DECLARE_FUTIL_COMMAND(vb2_verify_fw, do_vb2_verify_fw,
- "Verifies firmware using vboot2 library",
- print_help);