diff options
author | Daisuke Nojiri <dnojiri@chromium.org> | 2016-09-27 08:52:47 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-10-11 10:56:54 -0700 |
commit | dc96c6c0185b18ec27e724ea5898100ec85e1ed6 (patch) | |
tree | 533e61e4eb2bd792e3d3770b63a4c3f72903a2ca | |
parent | 985ad0e115984f1b7b3a5ffe01954b8bfd6af8e4 (diff) | |
download | vboot-dc96c6c0185b18ec27e724ea5898100ec85e1ed6.tar.gz |
bdb: Add bdb_get_hash_by_index
bdb_get_hash_by_index returns a hash entry from a BDB using an index.
bdb_get_hash is also renamed to bdb_get_hash_by_type. bdb_get_hash
is deprecated. Callers are expected to call bdb_get_hash_by_index(buf, 0)
instead.
BUG=none
BRANCH=none
TEST=make runtests
Change-Id: Id99926123c0ac9094574eb057c63f79eceda2867
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/392947
Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r-- | firmware/bdb/bdb.c | 31 | ||||
-rw-r--r-- | firmware/bdb/bdb.h | 4 | ||||
-rw-r--r-- | tests/bdb_sprw_test.c | 2 | ||||
-rw-r--r-- | tests/bdb_test.c | 18 |
4 files changed, 45 insertions, 10 deletions
diff --git a/firmware/bdb/bdb.c b/firmware/bdb/bdb.c index 4360ab76..e102d7b4 100644 --- a/firmware/bdb/bdb.c +++ b/firmware/bdb/bdb.c @@ -271,14 +271,21 @@ const void *bdb_get_oem_area_1(const void *buf) return b8 + p->struct_size; } -const struct bdb_hash *bdb_get_hash(const void *buf, enum bdb_data_type type) +static const void *bdb_get_hash(const void *buf) { const struct bdb_data *data = bdb_get_data(buf); const uint8_t *b8 = bdb_get_oem_area_1(buf); - int i; /* Hashes follow OEM area 0 */ - b8 += data->oem_area_1_size; + return b8 + data->oem_area_1_size; +} + +const struct bdb_hash *bdb_get_hash_by_type(const void *buf, + enum bdb_data_type type) +{ + const struct bdb_data *data = bdb_get_data(buf); + const uint8_t *b8 = bdb_get_hash(buf); + int i; /* Search for a matching hash */ for (i = 0; i < data->num_hashes; i++, b8 += data->hash_entry_size) { @@ -291,6 +298,24 @@ const struct bdb_hash *bdb_get_hash(const void *buf, enum bdb_data_type type) return NULL; } +const struct bdb_hash *bdb_get_hash_by_index(const void *buf, int index) +{ + const struct bdb_data *data = bdb_get_data(buf); + const uint8_t *p = bdb_get_hash(buf); + const struct bdb_hash *h = NULL; + int i; + + /* Search for a matching hash */ + for (i = 0; i < data->num_hashes; i++, p += data->hash_entry_size) { + if (i == index) { + h = (const struct bdb_hash *)p; + break; + } + } + + return h; +} + const struct bdb_sig *bdb_get_data_sig(const void *buf) { const struct bdb_data *data = bdb_get_data(buf); diff --git a/firmware/bdb/bdb.h b/firmware/bdb/bdb.h index 4f411c18..9e13696c 100644 --- a/firmware/bdb/bdb.h +++ b/firmware/bdb/bdb.h @@ -154,7 +154,9 @@ const struct bdb_key *bdb_get_datakey(const void *buf); const struct bdb_sig *bdb_get_header_sig(const void *buf); const struct bdb_data *bdb_get_data(const void *buf); const void *bdb_get_oem_area_1(const void *buf); -const struct bdb_hash *bdb_get_hash(const void *buf, enum bdb_data_type type); +const struct bdb_hash *bdb_get_hash_by_type(const void *buf, + enum bdb_data_type type); +const struct bdb_hash *bdb_get_hash_by_index(const void *buf, int index); const struct bdb_sig *bdb_get_data_sig(const void *buf); /** diff --git a/tests/bdb_sprw_test.c b/tests/bdb_sprw_test.c index 12b0bd7f..1f5be951 100644 --- a/tests/bdb_sprw_test.c +++ b/tests/bdb_sprw_test.c @@ -131,7 +131,7 @@ static void verstage_main(void) /* 1. Locate BDB */ /* 2. Get bdb_hash structure for AP-RW */ - hash = bdb_get_hash(bdb, BDB_DATA_AP_RW); + hash = bdb_get_hash_by_type(bdb, BDB_DATA_AP_RW); fprintf(stderr, "Got hash of AP-RW\n"); /* 3. Load & calculate digest of AP-RW */ diff --git a/tests/bdb_test.c b/tests/bdb_test.c index 3c90e98c..0dd76190 100644 --- a/tests/bdb_test.c +++ b/tests/bdb_test.c @@ -411,11 +411,12 @@ void check_bdb_verify(const char *key_dir) TEST_EQ_S(bdb_verify(h, hsize, bdbkey_digest), BDB_ERROR_DATA_SIG); memcpy(h, hgood, hsize); - ((struct bdb_hash *)bdb_get_hash(h, BDB_DATA_SP_RW))->offset++; + ((struct bdb_hash *)bdb_get_hash_by_type(h, BDB_DATA_SP_RW))->offset++; TEST_EQ_S(bdb_verify(h, hsize, bdbkey_digest), BDB_ERROR_DATA_SIG); memcpy(h, hgood, hsize); - ((struct bdb_hash *)bdb_get_hash(h, BDB_DATA_AP_RW))->digest[0] ^= 0x96; + ((struct bdb_hash *)bdb_get_hash_by_type(h, BDB_DATA_AP_RW)) + ->digest[0] ^= 0x96; TEST_EQ_S(bdb_verify(h, hsize, bdbkey_digest), BDB_ERROR_DATA_SIG); /* @@ -454,10 +455,17 @@ void check_bdb_verify(const char *key_dir) /* Test getting hash entries */ memcpy(h, hgood, hsize); - TEST_EQ_S(bdb_get_hash(h, BDB_DATA_SP_RW)->offset, hash[0].offset); - TEST_EQ_S(bdb_get_hash(h, BDB_DATA_AP_RW)->offset, hash[1].offset); + TEST_EQ_S(bdb_get_hash_by_type(h, BDB_DATA_SP_RW) + ->offset, hash[0].offset); + TEST_EQ_S(bdb_get_hash_by_index(h, 0) + ->offset, hash[0].offset); + TEST_EQ_S(bdb_get_hash_by_type(h, BDB_DATA_AP_RW) + ->offset, hash[1].offset); + TEST_EQ_S(bdb_get_hash_by_index(h, 1) + ->offset, hash[1].offset); /* And a non-existent one */ - TEST_EQ_S(bdb_get_hash(h, BDB_DATA_MCU)!=NULL, 0); + TEST_PTR_EQ(bdb_get_hash_by_type(h, BDB_DATA_MCU), NULL, NULL); + TEST_PTR_EQ(bdb_get_hash_by_index(h, 2), NULL, NULL); /* * TODO: Verify wraparound checks works. That can only be tested on a |