summaryrefslogtreecommitdiff
path: root/tests/vb2_api_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/vb2_api_tests.c')
-rw-r--r--tests/vb2_api_tests.c96
1 files changed, 88 insertions, 8 deletions
diff --git a/tests/vb2_api_tests.c b/tests/vb2_api_tests.c
index 23078cf9..3ed8bd5f 100644
--- a/tests/vb2_api_tests.c
+++ b/tests/vb2_api_tests.c
@@ -38,6 +38,16 @@ const int mock_sig_size = 64;
static uint8_t digest_result[VB2_SHA256_DIGEST_SIZE];
static const uint32_t digest_result_size = sizeof(digest_result);
+static const struct vb2_hash mock_mhash = {
+ .algo = VB2_HASH_SHA256,
+ .sha256 = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+ },
+};
+
/* Mocked function data */
static int force_dev_mode;
@@ -56,6 +66,7 @@ enum reset_type {
FOR_MISC,
FOR_EXTEND_HASH,
FOR_CHECK_HASH,
+ FOR_METADATA_HASH,
};
static void reset_common_data(enum reset_type t)
@@ -93,15 +104,31 @@ static void reset_common_data(enum reset_type t)
sd->preamble_size = sizeof(*pre);
vb2_set_workbuf_used(ctx, sd->preamble_offset + sd->preamble_size);
pre = vb2_member_of(sd, sd->preamble_offset);
- pre->body_signature.data_size = mock_body_size;
- pre->body_signature.sig_size = mock_sig_size;
- pre->flags = 0;
- sd->data_key_offset = sd->workbuf_used;
- sd->data_key_size = sizeof(*k) + 8;
- vb2_set_workbuf_used(ctx, sd->data_key_offset + sd->data_key_size);
- k = vb2_member_of(sd, sd->data_key_offset);
- k->algorithm = mock_algorithm;
+ if (t == FOR_METADATA_HASH) {
+ struct vb2_hash *mhash;
+ pre->body_signature.data_size = 0;
+ pre->body_signature.sig_size = offsetof(struct vb2_hash, raw) +
+ vb2_digest_size(mock_mhash.algo);
+ pre->body_signature.sig_offset =
+ vb2_offset_of(&pre->body_signature,
+ vb2_member_of(sd, sd->workbuf_used));
+ pre->flags = 0;
+ mhash = vb2_member_of(sd, sd->workbuf_used);
+ vb2_set_workbuf_used(ctx, pre->body_signature.sig_size);
+ memcpy(mhash, &mock_mhash, pre->body_signature.sig_size);
+ } else {
+ pre->body_signature.data_size = mock_body_size;
+ pre->body_signature.sig_size = mock_sig_size;
+ pre->flags = 0;
+
+ sd->data_key_offset = sd->workbuf_used;
+ sd->data_key_size = sizeof(*k) + 8;
+ vb2_set_workbuf_used(ctx,
+ sd->data_key_offset + sd->data_key_size);
+ k = vb2_member_of(sd, sd->data_key_offset);
+ k->algorithm = mock_algorithm;
+ }
if (t == FOR_EXTEND_HASH || t == FOR_CHECK_HASH)
vb2api_init_hash(ctx, VB2_HASH_TAG_FW_BODY);
@@ -604,6 +631,7 @@ static void init_hash_tests(void)
{
struct vb2_packed_key *k;
int wb_used_before;
+ struct vb2_fw_preamble *pre;
/* For now, all we support is body signature hash */
reset_common_data(FOR_MISC);
@@ -649,6 +677,12 @@ static void init_hash_tests(void)
VB2_ERROR_API_INIT_HASH_DATA_KEY, "init hash data key");
reset_common_data(FOR_MISC);
+ pre = vb2_member_of(sd, sd->preamble_offset);
+ pre->body_signature.data_size = 0;
+ TEST_EQ(vb2api_init_hash(ctx, VB2_HASH_TAG_FW_BODY),
+ VB2_ERROR_API_INIT_HASH_DATA_KEY, "init hash data size");
+
+ reset_common_data(FOR_MISC);
sd->data_key_size--;
TEST_EQ(vb2api_init_hash(ctx, VB2_HASH_TAG_FW_BODY),
VB2_ERROR_UNPACK_KEY_SIZE, "init hash data key size");
@@ -792,6 +826,50 @@ static void check_hash_tests(void)
VB2_ERROR_RSA_VERIFY_DIGEST, "check hash finalize");
}
+static void get_metadata_hash_test(void)
+{
+ struct vb2_hash *hash;
+ struct vb2_fw_preamble *pre;
+
+ reset_common_data(FOR_MISC);
+ TEST_EQ(vb2api_get_metadata_hash(ctx, &hash),
+ VB2_ERROR_API_INIT_HASH_DATA_KEY, "check body sig data size");
+
+ reset_common_data(FOR_MISC);
+ sd->preamble_size = 0;
+ TEST_EQ(vb2api_get_metadata_hash(ctx, &hash),
+ VB2_ERROR_API_CHECK_HASH_PREAMBLE, "check preamble size");
+
+ reset_common_data(FOR_METADATA_HASH);
+ pre = vb2_member_of(sd, sd->preamble_offset);
+ pre->body_signature.sig_size = 8;
+ TEST_EQ(vb2api_get_metadata_hash(ctx, &hash),
+ VB2_ERROR_API_CHECK_HASH_SIG_SIZE, "check too small sig size");
+
+ reset_common_data(FOR_METADATA_HASH);
+ pre = vb2_member_of(sd, sd->preamble_offset);
+ pre->body_signature.data_size = mock_body_size;
+ TEST_EQ(vb2api_get_metadata_hash(ctx, &hash),
+ VB2_ERROR_API_INIT_HASH_DATA_KEY, "check incorrect data size");
+
+ reset_common_data(FOR_METADATA_HASH);
+ pre = vb2_member_of(sd, sd->preamble_offset);
+ hash = (struct vb2_hash *)vb2_signature_data_mutable(
+ &pre->body_signature);
+ hash->algo = VB2_HASH_INVALID;
+ TEST_EQ(vb2api_get_metadata_hash(ctx, &hash),
+ VB2_ERROR_API_CHECK_HASH_SIG_SIZE, "check unsupported algo");
+
+ reset_common_data(FOR_METADATA_HASH);
+ TEST_EQ(vb2api_get_metadata_hash(ctx, &hash), VB2_SUCCESS,
+ "check metadata hash get");
+ TEST_PTR_NEQ(hash, NULL, "check metadata hash not null");
+ TEST_EQ(hash->algo, mock_mhash.algo, "check metadata hash algo");
+ TEST_EQ(memcmp(hash->raw, mock_mhash.raw,
+ vb2_digest_size(mock_mhash.algo)),
+ 0, "check metadata hash digest");
+}
+
int main(int argc, char* argv[])
{
misc_tests();
@@ -803,6 +881,8 @@ int main(int argc, char* argv[])
extend_hash_tests();
check_hash_tests();
+ get_metadata_hash_test();
+
get_pcr_digest_tests();
return gTestSuccess ? 0 : 255;