aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/cbfstool/Makefile.inc8
-rw-r--r--util/cbfstool/cbfs_hash.c33
-rw-r--r--util/cbfstool/cbfstool.c56
3 files changed, 97 insertions, 0 deletions
diff --git a/util/cbfstool/Makefile.inc b/util/cbfstool/Makefile.inc
index 9633ca48be..8e04411206 100644
--- a/util/cbfstool/Makefile.inc
+++ b/util/cbfstool/Makefile.inc
@@ -2,10 +2,14 @@ cbfsobj :=
cbfsobj += cbfstool.o
cbfsobj += common.o
cbfsobj += compress.o
+cbfsobj += cbfs.o
+cbfsobj += cbfs_hash.o
cbfsobj += cbfs_image.o
cbfsobj += cbfs-mkstage.o
cbfsobj += cbfs-mkpayload.o
cbfsobj += elfheaders.o
+cbfsobj += mem_pool.o
+cbfsobj += region.o
cbfsobj += rmodule.o
cbfsobj += xdr.o
cbfsobj += fit.o
@@ -129,6 +133,10 @@ $(objutil)/cbfstool/LzmaEnc.o: TOOLCFLAGS += -Wno-sign-compare -Wno-cast-qual
# Tolerate vboot warnings
$(objutil)/cbfstool/2sha_utility.o: TOOLCFLAGS += -Wno-sign-compare
$(objutil)/cbfstool/2sha1.o: TOOLCFLAGS += -Wno-cast-qual
+# Tolerate commonlib warnings
+$(objutil)/cbfstool/region.o: TOOLCFLAGS += -Wno-sign-compare -Wno-cast-qual
+$(objutil)/cbfstool/cbfs.o: TOOLCFLAGS += -Wno-sign-compare -Wno-cast-qual
+$(objutil)/cbfstool/mem_pool.o: TOOLCFLAGS += -Wno-sign-compare -Wno-cast-qual
$(objutil)/cbfstool/fmd.o: $(objutil)/cbfstool/fmd_parser.h
$(objutil)/cbfstool/fmd.o: $(objutil)/cbfstool/fmd_scanner.h
diff --git a/util/cbfstool/cbfs_hash.c b/util/cbfstool/cbfs_hash.c
new file mode 100644
index 0000000000..332a59b35d
--- /dev/null
+++ b/util/cbfstool/cbfs_hash.c
@@ -0,0 +1,33 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 2015 Google Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <commonlib/cbfs.h>
+#include <commonlib/region.h>
+
+int cbfs_calculate_hash(void *cbfs, size_t cbfs_sz,
+ enum vb2_hash_algorithm hash_algo,
+ void *digest, size_t digest_sz);
+
+int cbfs_calculate_hash(void *cbfs, size_t cbfs_sz,
+ enum vb2_hash_algorithm hash_algo,
+ void *digest, size_t digest_sz)
+{
+ struct mem_region_device mdev;
+
+ mem_region_device_init(&mdev, cbfs, cbfs_sz);
+
+ return cbfs_vb2_hash_contents(&mdev.rdev,
+ hash_algo, digest, digest_sz);
+}
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index f00aa30183..95199536f8 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -781,6 +781,59 @@ static int cbfs_print(void)
return 0;
}
+/* Forward declared so there aren't type collisions with cbfstool proper
+ * and commonlib. */
+int cbfs_calculate_hash(void *cbfs, size_t cbfs_sz,
+ enum vb2_hash_algorithm hash_algo,
+ void *digest, size_t digest_sz);
+
+static int cbfs_hash(void)
+{
+ struct cbfs_image src_image;
+ struct buffer src_buf;
+ struct buffer *dst = param.image_region;
+
+ if (param.hash == VB2_HASH_INVALID) {
+ ERROR("You need to specify -A/--hash-algorithm.\n");
+ return 1;
+ }
+
+ if (!param.source_region) {
+ ERROR("You need to specify -R/--source-region.\n");
+ return 1;
+ }
+
+ unsigned hash_size = widths_cbfs_hash[param.hash];
+ if (hash_size == 0)
+ return 1;
+
+ if (buffer_size(param.image_region) != hash_size) {
+ ERROR("Region '%s' size (%zd) not equal to hash size (%d).\n",
+ param.region_name, buffer_size(param.image_region),
+ hash_size);
+ return 1;
+ }
+
+ /* Obtain the source region and convert it to a cbfs_image. */
+ if (!partitioned_file_read_region(&src_buf, param.image_file,
+ param.source_region)) {
+ ERROR("Region not found in image: %s\n", param.source_region);
+ return 1;
+ }
+
+ if (cbfs_image_from_buffer(&src_image, &src_buf, param.headeroffset))
+ return 1;
+
+ if (cbfs_calculate_hash(buffer_get(&src_image.buffer),
+ buffer_size(&src_image.buffer),
+ param.hash, buffer_get(dst), hash_size)) {
+ ERROR("Hash calculation failed.\n");
+ return 1;
+ }
+
+ return 0;
+}
+
static int cbfs_extract(void)
{
if (!param.filename) {
@@ -947,6 +1000,7 @@ static const struct command commands[] = {
{"add-master-header", "H:r:vh?", cbfs_add_master_header, true, true},
{"copy", "r:R:h?", cbfs_copy, true, true},
{"create", "M:r:s:B:b:H:o:m:vh?", cbfs_create, true, true},
+ {"hashcbfs", "r:R:A:vh?", cbfs_hash, true, true},
{"extract", "H:r:m:n:f:vh?", cbfs_extract, true, false},
{"layout", "wvh?", cbfs_layout, false, false},
{"print", "H:r:vh?", cbfs_print, true, false},
@@ -1090,6 +1144,8 @@ static void usage(char *name)
" print [-r image,regions] "
"Show the contents of the ROM\n"
" extract [-r image,regions] [-m ARCH] -n NAME -f FILE "
+ " hashcbfs -r image_region -R source-region "
+ "Hashes CBFS source-region and saves digest\n"
"Extracts a raw payload from ROM\n"
" write -r image,regions -f file [-u | -d] "
"Write file into same-size [or larger] raw region\n"