summaryrefslogtreecommitdiff
path: root/tests/vb21_api_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/vb21_api_tests.c')
-rw-r--r--tests/vb21_api_tests.c117
1 files changed, 105 insertions, 12 deletions
diff --git a/tests/vb21_api_tests.c b/tests/vb21_api_tests.c
index 6c4e48df..c825bdbf 100644
--- a/tests/vb21_api_tests.c
+++ b/tests/vb21_api_tests.c
@@ -41,6 +41,16 @@ static const struct vb2_guid test_guid[4] = {
};
/* Mocked function data */
+
+static enum {
+ HWCRYPTO_DISABLED,
+ HWCRYPTO_ENABLED,
+ HWCRYPTO_FORBIDDEN,
+} hwcrypto_state;
+
+static struct vb2_digest_context hwcrypto_emulation_dc;
+
+static int retval_hwcrypto;
static int retval_vb2_load_fw_keyblock;
static int retval_vb2_load_fw_preamble;
@@ -74,6 +84,8 @@ static void reset_common_data(enum reset_type t)
vb2_secdata_create(&ctx);
vb2_secdata_init(&ctx);
+ memset(&hwcrypto_emulation_dc, 0, sizeof(hwcrypto_emulation_dc));
+ retval_hwcrypto = VB2_SUCCESS;
retval_vb2_load_fw_keyblock = VB2_SUCCESS;
retval_vb2_load_fw_preamble = VB2_SUCCESS;
@@ -84,6 +96,10 @@ static void reset_common_data(enum reset_type t)
(ctx.workbuf + sd->workbuf_preamble_offset);
pre->hash_count = 3;
pre->hash_offset = sig_offset = sizeof(*pre);
+ if (hwcrypto_state == HWCRYPTO_FORBIDDEN)
+ pre->flags = VB2_FIRMWARE_PREAMBLE_DISALLOW_HWCRYPTO;
+ else
+ pre->flags = 0;
for (i = 0; i < 3; i++) {
vb2_sign_data(&sig, mock_body, mock_body_size - 16 * i,
@@ -118,6 +134,47 @@ int vb2_load_fw_preamble(struct vb2_context *ctx)
return retval_vb2_load_fw_preamble;
}
+int vb2ex_hwcrypto_digest_init(enum vb2_hash_algorithm hash_alg,
+ uint32_t data_size)
+{
+ vb2_digest_init(&hwcrypto_emulation_dc, hash_alg);
+
+ switch (hwcrypto_state) {
+ case HWCRYPTO_DISABLED:
+ return VB2_ERROR_EX_HWCRYPTO_UNSUPPORTED;
+ case HWCRYPTO_ENABLED:
+ if (hash_alg != mock_hash_alg)
+ return VB2_ERROR_SHA_INIT_ALGORITHM;
+ else
+ return retval_hwcrypto;
+ case HWCRYPTO_FORBIDDEN:
+ default:
+ return VB2_ERROR_UNKNOWN;
+ }
+}
+
+int vb2ex_hwcrypto_digest_extend(const uint8_t *buf,
+ uint32_t size)
+{
+ vb2_digest_extend(&hwcrypto_emulation_dc, buf, size);
+
+ if (hwcrypto_state != HWCRYPTO_ENABLED)
+ return VB2_ERROR_UNKNOWN;
+
+ return retval_hwcrypto;
+}
+
+int vb2ex_hwcrypto_digest_finalize(uint8_t *digest,
+ uint32_t digest_size)
+{
+ vb2_digest_finalize(&hwcrypto_emulation_dc, digest, digest_size);
+
+ if (hwcrypto_state != HWCRYPTO_ENABLED)
+ return VB2_ERROR_UNKNOWN;
+
+ return retval_hwcrypto;
+}
+
/* Tests */
static void phase3_tests(void)
@@ -195,6 +252,13 @@ static void init_hash_tests(void)
sig->hash_alg = VB2_HASH_INVALID;
TEST_EQ(vb2api_init_hash2(&ctx, test_guid, &size),
VB2_ERROR_SHA_INIT_ALGORITHM, "init hash algorithm");
+
+ if (hwcrypto_state == HWCRYPTO_ENABLED) {
+ reset_common_data(FOR_MISC);
+ retval_hwcrypto = VB2_ERROR_MOCK;
+ TEST_EQ(vb2api_init_hash2(&ctx, test_guid, &size),
+ VB2_ERROR_MOCK, "init hash use hwcrypto");
+ }
}
static void extend_hash_tests(void)
@@ -223,12 +287,19 @@ static void extend_hash_tests(void)
TEST_EQ(vb2api_extend_hash(&ctx, mock_body, 0),
VB2_ERROR_API_EXTEND_HASH_SIZE, "hash extend empty");
- reset_common_data(FOR_EXTEND_HASH);
- dc = (struct vb2_digest_context *)
- (ctx.workbuf + sd->workbuf_hash_offset);
- dc->hash_alg = VB2_HASH_INVALID;
- TEST_EQ(vb2api_extend_hash(&ctx, mock_body, mock_body_size),
- VB2_ERROR_SHA_EXTEND_ALGORITHM, "hash extend fail");
+ if (hwcrypto_state == HWCRYPTO_ENABLED) {
+ reset_common_data(FOR_EXTEND_HASH);
+ retval_hwcrypto = VB2_ERROR_MOCK;
+ TEST_EQ(vb2api_extend_hash(&ctx, mock_body, mock_body_size),
+ VB2_ERROR_MOCK, "hash extend use hwcrypto");
+ } else {
+ reset_common_data(FOR_EXTEND_HASH);
+ dc = (struct vb2_digest_context *)
+ (ctx.workbuf + sd->workbuf_hash_offset);
+ dc->hash_alg = VB2_HASH_INVALID;
+ TEST_EQ(vb2api_extend_hash(&ctx, mock_body, mock_body_size),
+ VB2_ERROR_SHA_EXTEND_ALGORITHM, "hash extend fail");
+ }
}
static void check_hash_tests(void)
@@ -267,20 +338,42 @@ static void check_hash_tests(void)
VB2_ERROR_API_CHECK_HASH_WORKBUF_DIGEST, "check hash workbuf");
reset_common_data(FOR_CHECK_HASH);
- dc->hash_alg = VB2_HASH_INVALID;
- *((uint8_t *)sig + sig->sig_offset) ^= 0x55;
- TEST_EQ(vb2api_check_hash(&ctx),
- VB2_ERROR_SHA_FINALIZE_ALGORITHM, "check hash finalize");
-
- reset_common_data(FOR_CHECK_HASH);
*((uint8_t *)sig + sig->sig_offset) ^= 0x55;
TEST_EQ(vb2api_check_hash(&ctx),
VB2_ERROR_API_CHECK_HASH_SIG, "check hash sig");
+
+ if (hwcrypto_state == HWCRYPTO_ENABLED) {
+ reset_common_data(FOR_CHECK_HASH);
+ retval_hwcrypto = VB2_ERROR_MOCK;
+ TEST_EQ(vb2api_check_hash(&ctx),
+ VB2_ERROR_MOCK, "check hash use hwcrypto");
+ } else {
+ reset_common_data(FOR_CHECK_HASH);
+ dc->hash_alg = VB2_HASH_INVALID;
+ *((uint8_t *)sig + sig->sig_offset) ^= 0x55;
+ TEST_EQ(vb2api_check_hash(&ctx),
+ VB2_ERROR_SHA_FINALIZE_ALGORITHM, "check hash finaliz");
+ }
}
int main(int argc, char* argv[])
{
phase3_tests();
+
+ fprintf(stderr, "Running hash API tests without hwcrypto support...\n");
+ hwcrypto_state = HWCRYPTO_DISABLED;
+ init_hash_tests();
+ extend_hash_tests();
+ check_hash_tests();
+
+ fprintf(stderr, "Running hash API tests with hwcrypto support...\n");
+ hwcrypto_state = HWCRYPTO_ENABLED;
+ init_hash_tests();
+ extend_hash_tests();
+ check_hash_tests();
+
+ fprintf(stderr, "Running hash API tests with forbidden hwcrypto...\n");
+ hwcrypto_state = HWCRYPTO_FORBIDDEN;
init_hash_tests();
extend_hash_tests();
check_hash_tests();