futility: Add `show` test for CBFS integration firmware

This patch adds a new test file for test_show_contents.sh to cover the
CBFS integration image variant. The metadata hash for VBLOCK_B has been
intentionally invalidated so that we can test output for both valid and
invalid cases.

Also add some extra parseable output to balance out output lines between
valid and invalid cases.

BRANCH=none
BUG=none
TEST=make runtests

Signed-off-by: Julius Werner <jwerner@chromium.org>
Change-Id: I57cf75dae7a6fae4422170178b275fed27a12ce7
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/4691094
Reviewed-by: Saketh Pothireddy <spothire@google.com>
Reviewed-by: Yu-Ping Wu <yupingso@chromium.org>
diff --git a/futility/cmd_show.c b/futility/cmd_show.c
index 53e40dd..92a6544 100644
--- a/futility/cmd_show.c
+++ b/futility/cmd_show.c
@@ -229,6 +229,8 @@
 	    real_hash.algo == VB2_HASH_INVALID) {
 		ERROR("Failed to get metadata hash. Firmware body is"
 			" corrupted or is not a valid CBFS.\n");
+		FT_PARSEABLE_PRINT("body::metadata_hash::invalid\n");
+		FT_PARSEABLE_PRINT("body::signature::invalid\n");
 		return 1;
 	}
 
@@ -250,6 +252,9 @@
 		putchar('\n');
 		ERROR("Signature hash does not match with"
 			" real metadata hash.\n");
+
+		/* To balance out signature::valid otherwise printed by caller. */
+		FT_PARSEABLE_PRINT("body::signature::invalid\n");
 		return 1;
 	} else {
 		FT_PRINT("  Body metadata hash valid!\n",
diff --git a/tests/futility/data/bios_coachz_cbfs.bin b/tests/futility/data/bios_coachz_cbfs.bin
new file mode 100644
index 0000000..a97c875
--- /dev/null
+++ b/tests/futility/data/bios_coachz_cbfs.bin
Binary files differ
diff --git a/tests/futility/expect_output/show.parseable.tests_futility_data_bios_coachz_cbfs.bin b/tests/futility/expect_output/show.parseable.tests_futility_data_bios_coachz_cbfs.bin
new file mode 100644
index 0000000..b2570d2
--- /dev/null
+++ b/tests/futility/expect_output/show.parseable.tests_futility_data_bios_coachz_cbfs.bin
@@ -0,0 +1,68 @@
+bios::GBB::version::1.2
+bios::GBB::flags::48
+bios::GBB::hwid::offset::128
+bios::GBB::hwid::size::256
+bios::GBB::bmpvf::offset::4480
+bios::GBB::bmpvf::size::0
+bios::GBB::root_key::offset::384
+bios::GBB::root_key::size::4096
+bios::GBB::recovery_key::offset::4480
+bios::GBB::recovery_key::size::4096
+bios::GBB::size::8576
+bios::GBB::header::valid
+bios::GBB::hwid::value::COACHZ TEST 0650
+bios::GBB::hwid::digest::algorithm::2::SHA256
+bios::GBB::hwid::digest::hex::9ce45fcb7252c838c077a7f474ef45483134bd13455644304ab308fb717bb8d7
+bios::GBB::hwid::digest::valid
+bios::GBB::root_key::valid
+bios::GBB::root_key::api::1.0
+bios::GBB::root_key::algorithm::11::RSA8192 SHA512
+bios::GBB::root_key::version::1
+bios::GBB::root_key::sha1_sum::b11d74edd286c144e1135b49e7f0bc20cf041f10
+bios::GBB::recovery_key::valid
+bios::GBB::recovery_key::api::1.0
+bios::GBB::recovery_key::algorithm::11::RSA8192 SHA512
+bios::GBB::recovery_key::version::1
+bios::GBB::recovery_key::sha1_sum::c14bd720b70d97394257e3e826bd8f43de48d4ed
+bios::VBLOCK_A::keyblock::valid
+bios::VBLOCK_A::keyblock::signature::valid
+bios::VBLOCK_A::keyblock::size::2232
+bios::VBLOCK_A::keyblock::flags::23::!DEV:DEV:!REC:!MINIOS
+bios::VBLOCK_A::keyblock::data_key::algorithm::7::RSA4096 SHA256
+bios::VBLOCK_A::keyblock::data_key::version::1
+bios::VBLOCK_A::keyblock::data_key::sha1_sum::e2c1c92d7d7aa7dfed5e8375edd30b7ae52b7450
+bios::VBLOCK_A::preamble::valid
+bios::VBLOCK_A::preamble::size::1688
+bios::VBLOCK_A::preamble::header_version::2.1
+bios::VBLOCK_A::preamble::firmware_version::1
+bios::VBLOCK_A::preamble::kernel_subkey::algorithm::7::RSA4096 SHA256
+bios::VBLOCK_A::preamble::kernel_subkey::version::1
+bios::VBLOCK_A::preamble::kernel_subkey::sha1_sum::5d2b220899c4403d564092ada3f12d3cc4483223
+bios::VBLOCK_A::preamble::flags::0
+bios::VBLOCK_A::body::size::0
+bios::VBLOCK_A::body::metatadata_hash::algorithm::2::SHA256
+bios::VBLOCK_A::body::metatadata_hash::hex::e4a0de4b12ffa0cfa7022f3f16f5dabf77de0d1fb35c6c5d72969113bd48e979
+bios::VBLOCK_A::body::metadata_hash::valid
+bios::VBLOCK_A::body::signature::valid
+bios::VBLOCK_B::keyblock::valid
+bios::VBLOCK_B::keyblock::signature::valid
+bios::VBLOCK_B::keyblock::size::2232
+bios::VBLOCK_B::keyblock::flags::23::!DEV:DEV:!REC:!MINIOS
+bios::VBLOCK_B::keyblock::data_key::algorithm::7::RSA4096 SHA256
+bios::VBLOCK_B::keyblock::data_key::version::1
+bios::VBLOCK_B::keyblock::data_key::sha1_sum::e2c1c92d7d7aa7dfed5e8375edd30b7ae52b7450
+bios::VBLOCK_B::preamble::valid
+bios::VBLOCK_B::preamble::size::1688
+bios::VBLOCK_B::preamble::header_version::2.1
+bios::VBLOCK_B::preamble::firmware_version::1
+bios::VBLOCK_B::preamble::kernel_subkey::algorithm::7::RSA4096 SHA256
+bios::VBLOCK_B::preamble::kernel_subkey::version::1
+bios::VBLOCK_B::preamble::kernel_subkey::sha1_sum::5d2b220899c4403d564092ada3f12d3cc4483223
+bios::VBLOCK_B::preamble::flags::0
+bios::VBLOCK_B::body::size::0
+bios::VBLOCK_B::body::metatadata_hash::algorithm::2::SHA256
+bios::VBLOCK_B::body::metatadata_hash::hex::e4a0de4b12ffa0cfa7022f3f16f5dabf77de0d1fb35c6c5d72969113bd48e979
+bios::VBLOCK_B::body::metadata_hash::invalid
+bios::VBLOCK_B::body::metadata_hash::expected::algorithm::2::SHA256
+bios::VBLOCK_B::body::metadata_hash::expected::hex::5dcf350a320d69c3b93288ef34ff391901419ba0836b45a65ae292b4fdbf59f2
+bios::VBLOCK_B::body::signature::invalid
diff --git a/tests/futility/expect_output/show.tests_futility_data_bios_coachz_cbfs.bin b/tests/futility/expect_output/show.tests_futility_data_bios_coachz_cbfs.bin
new file mode 100644
index 0000000..10fdf06
--- /dev/null
+++ b/tests/futility/expect_output/show.tests_futility_data_bios_coachz_cbfs.bin
@@ -0,0 +1,66 @@
+BIOS:                    tests/futility/data/bios_coachz_cbfs.bin
+GBB header:              GBB
+  Version:               1.2
+  Flags:                 0x00000030
+  Regions:                 offset       size
+    hwid                 0x00000080   0x00000100
+    bmpvf                0x00001180   0x00000000
+    rootkey              0x00000180   0x00001000
+    recovery_key         0x00001180   0x00001000
+  Size:                  0x00002180 / 0x00002f00
+GBB content:
+  HWID:                  COACHZ TEST 0650
+     digest:             9ce45fcb7252c838c077a7f474ef45483134bd13455644304ab308fb717bb8d7   valid
+  Root Key:
+    Vboot API:           1.0
+    Algorithm:           11 RSA8192 SHA512
+    Key Version:         1
+    Key sha1sum:         b11d74edd286c144e1135b49e7f0bc20cf041f10
+  Recovery Key:
+    Vboot API:           1.0
+    Algorithm:           11 RSA8192 SHA512
+    Key Version:         1
+    Key sha1sum:         c14bd720b70d97394257e3e826bd8f43de48d4ed
+Firmware body:           FW_MAIN_A
+  Offset:                0x00414000
+  Size:                  0x0013df00
+Firmware body:           FW_MAIN_B
+  Offset:                0x00554000
+  Size:                  0x0013df00
+Keyblock:                VBLOCK_A
+  Signature:             valid
+  Size:                  0x8b8
+  Flags:                 23  !DEV DEV !REC !MINIOS
+  Data key algorithm:    7 RSA4096 SHA256
+  Data key version:      1
+  Data key sha1sum:      e2c1c92d7d7aa7dfed5e8375edd30b7ae52b7450
+Firmware Preamble:
+  Size:                  1688
+  Header version:        2.1
+  Firmware version:      1
+  Kernel key algorithm:  7 RSA4096 SHA256
+  Kernel key version:    1
+  Kernel key sha1sum:    5d2b220899c4403d564092ada3f12d3cc4483223
+  Firmware body size:    0
+  Preamble flags:        0
+  Body metadata hash:    SHA256 e4a0de4b12ffa0cfa7022f3f16f5dabf77de0d1fb35c6c5d72969113bd48e979
+  Body metadata hash valid!
+Body verification succeeded.
+Keyblock:                VBLOCK_B
+  Signature:             valid
+  Size:                  0x8b8
+  Flags:                 23  !DEV DEV !REC !MINIOS
+  Data key algorithm:    7 RSA4096 SHA256
+  Data key version:      1
+  Data key sha1sum:      e2c1c92d7d7aa7dfed5e8375edd30b7ae52b7450
+Firmware Preamble:
+  Size:                  1688
+  Header version:        2.1
+  Firmware version:      1
+  Kernel key algorithm:  7 RSA4096 SHA256
+  Kernel key version:    1
+  Kernel key sha1sum:    5d2b220899c4403d564092ada3f12d3cc4483223
+  Firmware body size:    0
+  Preamble flags:        0
+  Body metadata hash:    SHA256 e4a0de4b12ffa0cfa7022f3f16f5dabf77de0d1fb35c6c5d72969113bd48e979
+  MISMATCH! Real hash:   SHA256:5dcf350a320d69c3b93288ef34ff391901419ba0836b45a65ae292b4fdbf59f2
diff --git a/tests/futility/test_show_contents.sh b/tests/futility/test_show_contents.sh
index fbd6cf3..349da5f 100755
--- a/tests/futility/test_show_contents.sh
+++ b/tests/futility/test_show_contents.sh
@@ -20,6 +20,7 @@
   tests/futility/data/fw_vblock.bin
   tests/futility/data/fw_gbb.bin
   tests/futility/data/bios_peppy_mp.bin
+  tests/futility/data/bios_coachz_cbfs.bin
   tests/futility/data/kern_preamble.bin
   tests/futility/data/sample.vbpubk2
   tests/futility/data/sample.vbprik2
@@ -45,6 +46,7 @@
   tests/futility/data/fw_vblock.bin
   tests/futility/data/fw_gbb.bin
   tests/futility/data/bios_peppy_mp.bin
+  tests/futility/data/bios_coachz_cbfs.bin
   tests/futility/data/kern_preamble.bin
 "
 for file in ${PARSE_SUPPORTED_FILES}; do