summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2016-09-27 08:52:47 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-10-11 10:56:54 -0700
commitdc96c6c0185b18ec27e724ea5898100ec85e1ed6 (patch)
tree533e61e4eb2bd792e3d3770b63a4c3f72903a2ca
parent985ad0e115984f1b7b3a5ffe01954b8bfd6af8e4 (diff)
downloadvboot-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.c31
-rw-r--r--firmware/bdb/bdb.h4
-rw-r--r--tests/bdb_sprw_test.c2
-rw-r--r--tests/bdb_test.c18
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