From c3daa95c50ad6976507c2f164f8be87bc7b75c1f Mon Sep 17 00:00:00 2001 From: Daisuke Nojiri Date: Thu, 22 Sep 2016 09:48:20 -0700 Subject: [PATCH] bdb: Make 'futility show' support BDB This patch makes futility show command support boot block descriptor (BDB) of the common boot flow. BUG=chromium:649554 BRANCH=none TEST=make runtests. Ran futility show bdb.bin. Change-Id: I5f199a32ab1c268351e822e37ed39e41ae19bc7a Signed-off-by: Daisuke Nojiri Reviewed-on: https://chromium-review.googlesource.com/388631 Reviewed-by: Randall Spangler --- Makefile | 3 +- futility/bdb_helper.c | 68 ++++++++++++++++++++++++++++++ futility/cmd_show.c | 1 + futility/file_type.inc | 4 ++ tests/futility/data/bdb.bin | Bin 0 -> 3716 bytes tests/futility/test_file_types.c | 1 + tests/futility/test_file_types.sh | 1 + 7 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 futility/bdb_helper.c create mode 100644 tests/futility/data/bdb.bin diff --git a/Makefile b/Makefile index d56b97e237..490b9f797e 100644 --- a/Makefile +++ b/Makefile @@ -691,7 +691,8 @@ FUTIL_SRCS = \ futility/file_type_rwsig.c \ futility/file_type_usbpd1.c \ futility/vb1_helper.c \ - futility/vb2_helper.c + futility/vb2_helper.c \ + futility/bdb_helper.c # List of commands built in futility and futility_s. FUTIL_STATIC_CMD_LIST = ${BUILD}/gen/futility_static_cmds.c diff --git a/futility/bdb_helper.c b/futility/bdb_helper.c new file mode 100644 index 0000000000..d2f428c8d0 --- /dev/null +++ b/futility/bdb_helper.c @@ -0,0 +1,68 @@ +/* Copyright 2016 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. + * + * Boot descriptor block helper functions + */ + +#include + +#include "2sha.h" +#include "bdb.h" +#include "bdb_struct.h" +#include "file_type.h" + +enum futil_file_type ft_recognize_bdb(uint8_t *buf, uint32_t len) +{ + const struct bdb_header *header = bdb_get_header(buf); + + if (bdb_check_header(header, len)) + return FILE_TYPE_UNKNOWN; + + return FILE_TYPE_BDB; +} + +static void print_digest(const char *label, const uint8_t *digest, size_t size) +{ + int i; + + if (label) + printf("%s", label); + for (i = 0; i < size; i++) + printf("%02x", digest[i]); + printf("\n"); +} + +static void show_bdb_header(const uint8_t *bdb) +{ + const struct bdb_header *header = bdb_get_header(bdb); + const struct bdb_key *key = bdb_get_bdbkey(bdb); + uint8_t digest[BDB_SHA256_DIGEST_SIZE]; + + printf("BDB Header:\n"); + printf(" Struct Version: 0x%x:0x%x\n", + header->struct_major_version, header->struct_minor_version); + + bdb_sha256(digest, key, key->struct_size); + print_digest(" BDB key digest: ", digest, sizeof(digest)); + printf(" size: %d\n", key->struct_size); +} + + +int ft_show_bdb(const char *name, uint8_t *buf, uint32_t len, void *data) +{ + const struct bdb_header *header = bdb_get_header(buf); + int rv; + + /* We can get here because of '--type' option */ + rv = bdb_check_header(header, len); + if (rv) { + fprintf(stderr, "ERROR: Invalid BDB blob: %d\n", rv); + return 1; + } + + printf("Boot Descriptor Block: %s\n", name); + show_bdb_header(buf); + + return 0; +} diff --git a/futility/cmd_show.c b/futility/cmd_show.c index 261197de2a..9ad55ad8d3 100644 --- a/futility/cmd_show.c +++ b/futility/cmd_show.c @@ -399,6 +399,7 @@ static const char usage[] = "\n" "\n" "Where FILE could be\n" "\n" + " a BDB\n" " a keyblock (.keyblock)\n" " a firmware preamble signature (VBLOCK_A/B)\n" " a firmware image (bios.bin)\n" diff --git a/futility/file_type.inc b/futility/file_type.inc index 9259f648ef..b48c6c42bb 100644 --- a/futility/file_type.inc +++ b/futility/file_type.inc @@ -80,3 +80,7 @@ FILE_TYPE(USBPD1, "usbpd1", "USB-PD charger image (v1.0)", R_(ft_recognize_usbpd1), S_(ft_show_usbpd1), S_(ft_sign_usbpd1)) +FILE_TYPE(BDB, "bdb", "Common Boot Flow Boot Descriptor Block", + R_(ft_recognize_bdb), + S_(ft_show_bdb), + NONE) diff --git a/tests/futility/data/bdb.bin b/tests/futility/data/bdb.bin new file mode 100644 index 0000000000000000000000000000000000000000..1fe844636c77a2ed2f49be77233b7e026689118f GIT binary patch literal 3716 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