summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2014-10-31 15:18:48 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-11-05 06:05:01 +0000
commit6b5b8f65d52bc91ca37e5cb484867251d81136b1 (patch)
treea5611c53ec710ed4ea89d825d625b3dec12ff5c0 /tests
parentf97d3879d021159a8d5e050f4533da81f92b267d (diff)
downloadvboot-6b5b8f65d52bc91ca37e5cb484867251d81136b1.tar.gz
vboot2: use common header size fields
Add functions for verifying object integrity using common header size fields. Convert vb2_packed_key2 to use the the new functions. This isn't much prettier for packed keys; the benefit is more obvious for keyblocks (coming next). BUG=chromium:423882 BRANCH=none TEST=VBOOT2=1 make runtests Change-Id: I0c09533368abb7ced3b5ac622a15e62832413b7f Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/226874 Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/vb2_common2_tests.c8
-rw-r--r--tests/vb2_common_tests.c171
2 files changed, 139 insertions, 40 deletions
diff --git a/tests/vb2_common2_tests.c b/tests/vb2_common2_tests.c
index c2d11d99..050695ee 100644
--- a/tests/vb2_common2_tests.c
+++ b/tests/vb2_common2_tests.c
@@ -99,14 +99,14 @@ static void test_unpack_key2(const VbPublicKey *orig_key)
key2 = vb2_convert_packed_key2(key1, "Test key", &size);
key2->key_offset += 4;
TEST_EQ(vb2_unpack_key2(&pubk, (uint8_t *)key2, size),
- VB2_ERROR_INSIDE_DATA_OUTSIDE,
+ VB2_ERROR_COMMON_MEMBER_SIZE,
"vb2_unpack_key2() buffer too small");
free(key2);
key2 = vb2_convert_packed_key2(key1, "Test key", &size);
key2->c.fixed_size += size;
TEST_EQ(vb2_unpack_key2(&pubk, (uint8_t *)key2, size),
- VB2_ERROR_INSIDE_DATA_OUTSIDE,
+ VB2_ERROR_COMMON_FIXED_SIZE,
"vb2_unpack_key2() buffer too small for desc");
free(key2);
@@ -161,7 +161,7 @@ static void test_unpack_key2(const VbPublicKey *orig_key)
free(key2);
key2 = vb2_convert_packed_key2(key1, "Test key", &size);
- key2->key_size--;
+ key2->key_size -= 4;
TEST_EQ(vb2_unpack_key2(&pubk, (uint8_t *)key2, size),
VB2_ERROR_UNPACK_KEY_SIZE,
"vb2_unpack_key2() invalid size");
@@ -170,7 +170,7 @@ static void test_unpack_key2(const VbPublicKey *orig_key)
key2 = vb2_convert_packed_key2(key1, "Test key", &size);
key2->key_offset--;
TEST_EQ(vb2_unpack_key2(&pubk, (uint8_t *)key2, size),
- VB2_ERROR_UNPACK_KEY_ALIGN,
+ VB2_ERROR_COMMON_MEMBER_UNALIGNED,
"vb2_unpack_key2() unaligned data");
free(key2);
diff --git a/tests/vb2_common_tests.c b/tests/vb2_common_tests.c
index 31fa036d..8f93a44c 100644
--- a/tests/vb2_common_tests.c
+++ b/tests/vb2_common_tests.c
@@ -243,42 +243,6 @@ static void test_helper_functions(void)
}
{
- uint8_t cbuf[sizeof(struct vb2_struct_common) + 128];
- struct vb2_struct_common *c = (struct vb2_struct_common *)cbuf;
-
- c->total_size = sizeof(cbuf);
- c->fixed_size = sizeof(*c);
- c->desc_size = 128;
- cbuf[sizeof(cbuf) - 1] = 0;
- TEST_SUCC(vb2_verify_common_header(cbuf, sizeof(cbuf), c),
- "CommonInside at start");
-
- c[1].fixed_size = sizeof(*c);
- c[1].desc_size = 128 - sizeof(*c);
- TEST_SUCC(vb2_verify_common_header(cbuf, sizeof(cbuf), c + 1),
- "CommonInside after start");
-
- TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf) - 1, c),
- VB2_ERROR_INSIDE_DATA_OUTSIDE,
- "CommonInside key too big");
-
- c->fixed_size = sizeof(cbuf);
- TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf), c),
- VB2_ERROR_INSIDE_DATA_OUTSIDE,
- "CommonInside offset too big");
- c->fixed_size = sizeof(*c);
-
- cbuf[sizeof(cbuf) - 1] = 1;
- TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf), c),
- VB2_ERROR_DESC_TERMINATOR,
- "CommonInside description not terminated");
-
- c->desc_size = 0;
- TEST_SUCC(vb2_verify_common_header(cbuf, sizeof(cbuf), c),
- "CommonInside no description");
- }
-
- {
struct vb2_packed_key k = {.key_offset = sizeof(k),
.key_size = 128};
TEST_SUCC(vb2_verify_packed_key_inside(&k, sizeof(k)+128, &k),
@@ -321,6 +285,140 @@ static void test_helper_functions(void)
}
}
+/**
+ * Common header functions
+ */
+static void test_common_header_functions(void)
+{
+ uint8_t cbuf[sizeof(struct vb2_struct_common) + 128];
+ uint8_t cbufgood[sizeof(cbuf)];
+ struct vb2_struct_common *c = (struct vb2_struct_common *)cbuf;
+ struct vb2_struct_common *c2;
+ uint32_t desc_end, m;
+
+ c->total_size = sizeof(cbuf);
+ c->fixed_size = sizeof(*c);
+ c->desc_size = 32;
+ desc_end = c->fixed_size + c->desc_size;
+ cbuf[desc_end - 1] = 0;
+
+ c2 = (struct vb2_struct_common *)(cbuf + desc_end);
+ c2->total_size = c->total_size - desc_end;
+ c2->fixed_size = sizeof(*c2);
+ c2->desc_size = 0;
+
+ TEST_SUCC(vb2_verify_common_header(cbuf, sizeof(cbuf)),
+ "vb2_verify_common_header() good");
+ memcpy(cbufgood, cbuf, sizeof(cbufgood));
+
+ memcpy(cbuf, cbufgood, sizeof(cbuf));
+ c->total_size += 4;
+ TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
+ VB2_ERROR_COMMON_TOTAL_SIZE,
+ "vb2_verify_common_header() total size");
+
+ memcpy(cbuf, cbufgood, sizeof(cbuf));
+ c->fixed_size = c->total_size + 4;
+ TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
+ VB2_ERROR_COMMON_FIXED_SIZE,
+ "vb2_verify_common_header() fixed size");
+
+ memcpy(cbuf, cbufgood, sizeof(cbuf));
+ c->desc_size = c->total_size - c->fixed_size + 4;
+ TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
+ VB2_ERROR_COMMON_DESC_SIZE,
+ "vb2_verify_common_header() desc size");
+
+ memcpy(cbuf, cbufgood, sizeof(cbuf));
+ c->total_size--;
+ TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
+ VB2_ERROR_COMMON_TOTAL_UNALIGNED,
+ "vb2_verify_common_header() total unaligned");
+
+ memcpy(cbuf, cbufgood, sizeof(cbuf));
+ c->fixed_size++;
+ TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
+ VB2_ERROR_COMMON_FIXED_UNALIGNED,
+ "vb2_verify_common_header() fixed unaligned");
+
+ memcpy(cbuf, cbufgood, sizeof(cbuf));
+ c->desc_size--;
+ TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
+ VB2_ERROR_COMMON_DESC_UNALIGNED,
+ "vb2_verify_common_header() desc unaligned");
+
+ memcpy(cbuf, cbufgood, sizeof(cbuf));
+ c->desc_size = -4;
+ TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
+ VB2_ERROR_COMMON_DESC_WRAPS,
+ "vb2_verify_common_header() desc wraps");
+
+ memcpy(cbuf, cbufgood, sizeof(cbuf));
+ cbuf[desc_end - 1] = 1;
+ TEST_EQ(vb2_verify_common_header(cbuf, sizeof(cbuf)),
+ VB2_ERROR_COMMON_DESC_TERMINATOR,
+ "vb2_verify_common_header() desc not terminated");
+
+ /* Member checking function */
+ memcpy(cbuf, cbufgood, sizeof(cbuf));
+ m = 0;
+ TEST_SUCC(vb2_verify_common_member(cbuf, &m, c->total_size - 8, 4),
+ "vb2_verify_common_member()");
+ TEST_EQ(m, c->total_size - 4, " new minimum");
+
+ m = desc_end;
+ TEST_SUCC(vb2_verify_common_member(cbuf, &m, desc_end, 4),
+ "vb2_verify_common_member() good offset");
+ TEST_EQ(m, desc_end + 4, " new minimum");
+
+ m = 0;
+ TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 8, -4),
+ VB2_ERROR_COMMON_MEMBER_WRAPS,
+ "vb2_verify_common_member() wraps");
+
+ m = 0;
+ TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 7, 4),
+ VB2_ERROR_COMMON_MEMBER_UNALIGNED,
+ "vb2_verify_common_member() offset unaligned");
+
+ m = 0;
+ TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 8, 5),
+ VB2_ERROR_COMMON_MEMBER_UNALIGNED,
+ "vb2_verify_common_member() size unaligned");
+
+ m = 0;
+ TEST_EQ(vb2_verify_common_member(cbuf, &m, desc_end - 4, 4),
+ VB2_ERROR_COMMON_MEMBER_OVERLAP,
+ "vb2_verify_common_member() overlap");
+
+ m = desc_end + 4;
+ TEST_EQ(vb2_verify_common_member(cbuf, &m, desc_end, 4),
+ VB2_ERROR_COMMON_MEMBER_OVERLAP,
+ "vb2_verify_common_member() overlap 2");
+
+ m = 0;
+ TEST_EQ(vb2_verify_common_member(cbuf, &m, c->total_size - 4, 8),
+ VB2_ERROR_COMMON_MEMBER_SIZE,
+ "vb2_verify_common_member() size");
+
+ /* Subobject checking */
+ m = 0;
+ TEST_SUCC(vb2_verify_common_subobject(cbuf, &m, desc_end),
+ "vb2_verify_common_subobject() good offset");
+ TEST_EQ(m, sizeof(cbuf), " new minimum");
+
+ m = desc_end + 4;
+ TEST_EQ(vb2_verify_common_subobject(cbuf, &m, desc_end),
+ VB2_ERROR_COMMON_MEMBER_OVERLAP,
+ "vb2_verify_common_subobject() overlap");
+
+ m = 0;
+ c2->total_size += 4;
+ TEST_EQ(vb2_verify_common_subobject(cbuf, &m, desc_end),
+ VB2_ERROR_COMMON_TOTAL_SIZE,
+ "vb2_verify_common_subobject() size");
+}
+
int main(int argc, char* argv[])
{
test_memcmp();
@@ -328,6 +426,7 @@ int main(int argc, char* argv[])
test_workbuf();
test_struct_packing();
test_helper_functions();
+ test_common_header_functions();
return gTestSuccess ? 0 : 255;
}