diff options
author | Daisuke Nojiri <dnojiri@chromium.org> | 2016-09-26 14:08:04 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-10-11 10:56:52 -0700 |
commit | 985ad0e115984f1b7b3a5ffe01954b8bfd6af8e4 (patch) | |
tree | de727e9e176effdb504b8c5eedbb60825a9fa39e | |
parent | 93159a225083f134bace7d279cd84e46d5606350 (diff) | |
download | vboot-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.c | 39 | ||||
-rwxr-xr-x | tests/futility/test_bdb.sh | 12 |
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 |