summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2016-09-26 14:08:04 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-10-11 10:56:52 -0700
commit985ad0e115984f1b7b3a5ffe01954b8bfd6af8e4 (patch)
treede727e9e176effdb504b8c5eedbb60825a9fa39e
parent93159a225083f134bace7d279cd84e46d5606350 (diff)
downloadvboot-985ad0e115984f1b7b3a5ffe01954b8bfd6af8e4.tar.gz
bdb: Add --ignore_key_digest option to futility bdb --verify
When --ignore_key_digest is specified, futility bdb --verify command returns success even if the key digest didn't match. Warning message will be printed to remind the digest wasn't checked. BUG=chromium:649554 BRANCH=none TEST=Tested as follows: $ build/futility/futility bdb --verify tests/futility/data/bdb.bin \ --ignore_key_digest BDB is valid. Key digest doesn't match but ignored. $ echo $? 0 Change-Id: I996b0a4f7bbbcf546e2d958f28c5ee8fb251fb99 Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/392946 Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--futility/cmd_bdb.c39
-rwxr-xr-xtests/futility/test_bdb.sh12
2 files changed, 40 insertions, 11 deletions
diff --git a/futility/cmd_bdb.c b/futility/cmd_bdb.c
index 69a88f0d..c37ff1b0 100644
--- a/futility/cmd_bdb.c
+++ b/futility/cmd_bdb.c
@@ -41,6 +41,8 @@ enum {
OPT_PARTITION,
OPT_TYPE,
OPT_LOAD_ADDRESS,
+ /* Misc. options */
+ OPT_IGNORE_KEY_DIGEST,
OPT_VERSION,
OPT_HELP,
};
@@ -62,6 +64,7 @@ static const struct option long_opts[] = {
{"partition", 1, 0, OPT_PARTITION},
{"type", 1, 0, OPT_TYPE},
{"load_address", 1, 0, OPT_LOAD_ADDRESS},
+ {"ignore_key_digest", 0, 0, OPT_IGNORE_KEY_DIGEST},
{"version", 1, 0, OPT_VERSION},
{"help", 0, 0, OPT_HELP},
{NULL, 0, 0, 0}
@@ -447,7 +450,8 @@ exit:
return rv;
}
-static int do_verify(const char *bdb_filename, const char *key_digest_filename)
+static int do_verify(const char *bdb_filename, const char *key_digest_filename,
+ int ignore_key_digest)
{
uint8_t *bdb = NULL;
uint8_t *key_digest = NULL;
@@ -474,15 +478,24 @@ static int do_verify(const char *bdb_filename, const char *key_digest_filename)
}
rv = bdb_verify(bdb, bdb_size, key_digest);
- if (rv) {
- if (rv != BDB_GOOD_OTHER_THAN_KEY) {
- fprintf(stderr, "BDB is invalid: %d\n", rv);
- goto exit;
+ switch (rv) {
+ case BDB_SUCCESS:
+ fprintf(stderr, "BDB is successfully verified.\n");
+ break;
+ case BDB_GOOD_OTHER_THAN_KEY:
+ fprintf(stderr, "BDB is valid.");
+ if (ignore_key_digest) {
+ rv = BDB_SUCCESS;
+ fprintf(stderr,
+ " Key digest doesn't match but ignored.\n");
+ } else {
+ fprintf(stderr,
+ " Key digest doesn't match.\n");
}
- fprintf(stderr,
- "BDB is valid but key digest doesn't match\n");
- } else {
- fprintf(stderr, "BDB is successfully verified\n");
+ break;
+ default:
+ /* TODO: Probably nice to print translation of the error code */
+ fprintf(stderr, "BDB is invalid: %d.\n", rv);
}
exit:
@@ -518,6 +531,7 @@ static void print_help(int argc, char *argv[])
"\n"
"For '--verify <bdb_file> [OPTIONS]', optional OPTIONS are:\n"
" --key_digest <file> BDB key digest\n"
+ " --ignore_key_digest Ignore key digest mismatch\n"
"\n",
argv[0]);
}
@@ -538,6 +552,7 @@ static int do_bdb(int argc, char *argv[])
uint8_t partition = 0;
uint8_t type = 0;
uint64_t load_address = -1;
+ int ignore_key_digest = 0;
int parse_error = 0;
char *e;
int i;
@@ -628,6 +643,9 @@ static int do_bdb(int argc, char *argv[])
parse_error = 1;
}
break;
+ case OPT_IGNORE_KEY_DIGEST:
+ ignore_key_digest = 1;
+ break;
case OPT_VERSION:
version = strtoul(optarg, &e, 0);
if (!*optarg || (e && *e)) {
@@ -658,7 +676,8 @@ static int do_bdb(int argc, char *argv[])
datakey_pri_filename, datakey_pub_filename,
datakey_version);
case OPT_MODE_VERIFY:
- return do_verify(bdb_filename, key_digest_filename);
+ return do_verify(bdb_filename,
+ key_digest_filename, ignore_key_digest);
case OPT_MODE_NONE:
default:
fprintf(stderr, "Must specify a mode.\n");
diff --git a/tests/futility/test_bdb.sh b/tests/futility/test_bdb.sh
index c84c6d6e..426b3970 100755
--- a/tests/futility/test_bdb.sh
+++ b/tests/futility/test_bdb.sh
@@ -21,9 +21,15 @@ BDBKEY_DIGEST=${TESTDATA_DIR}/bdbkey_digest.bin
DATAKEY_DIGEST=${TESTDATA_DIR}/datakey_digest.bin
DATA_FILE=${TESTDATA_DIR}/sp-rw.bin
+# Verify a BDB
+#
+# $1: Key digest file
+# $2: Any remaining option passed to futility bdb --verify
verify() {
local key_digest=${1:-${BDBKEY_DIGEST}}
- ${FUTILITY} bdb --verify ${BDB_FILE} --key_digest ${key_digest}
+ local extra_option=${2:-}
+ ${FUTILITY} bdb --verify ${BDB_FILE} --key_digest ${key_digest} \
+ ${extra_option}
}
# Demonstrate bdb --create can create a valid BDB
@@ -53,6 +59,10 @@ ${FUTILITY} bdb --resign ${BDB_FILE} \
--bdbkey_pri ${DATAKEY_PRI} --bdbkey_pub ${DATAKEY_PUB}
verify ${DATAKEY_DIGEST}
+# Demonstrate futility bdb --verify can return success when key digest doesn't
+# match but --ignore_key_digest is specified.
+verify ${BDBKEY_DIGEST} --ignore_key_digest
+
# cleanup
rm -rf ${TMP}*
exit 0