summaryrefslogtreecommitdiff
path: root/tests/vb2_sha_api_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/vb2_sha_api_tests.c')
-rw-r--r--tests/vb2_sha_api_tests.c178
1 files changed, 130 insertions, 48 deletions
diff --git a/tests/vb2_sha_api_tests.c b/tests/vb2_sha_api_tests.c
index 6ed0b74b..be277b38 100644
--- a/tests/vb2_sha_api_tests.c
+++ b/tests/vb2_sha_api_tests.c
@@ -2,9 +2,11 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
- * Tests for vb2_hash_(calculate|verify) functions.
+ * Tests for vb2_hash_(calculate|verify) functions, and hwcrypto handling
+ * of vb2_digest_*.
*/
+#include "2api.h"
#include "2return_codes.h"
#include "2sha.h"
#include "2sysincludes.h"
@@ -17,41 +19,83 @@ _Static_assert(sizeof(mock_sha1) == VB2_SHA1_DIGEST_SIZE, "");
struct vb2_hash mock_hash;
uint8_t mock_buffer[] = "Mock Buffer";
-vb2_error_t mock_init_rv;
-vb2_error_t mock_extend_rv;
-vb2_error_t mock_finalize_rv;
+static enum hwcrypto_state {
+ HWCRYPTO_OK,
+ HWCRYPTO_NOTSUPPORTED,
+ HWCRYPTO_ERROR,
+ HWCRYPTO_ABORT,
+} hwcrypto_state;
-static void reset_common_data(void)
+static vb2_error_t hwcrypto_mock(enum hwcrypto_state *state)
{
+ switch (*state) {
+ case HWCRYPTO_OK:
+ return VB2_SUCCESS;
+ case HWCRYPTO_NOTSUPPORTED:
+ return VB2_ERROR_EX_HWCRYPTO_UNSUPPORTED;
+ case HWCRYPTO_ERROR:
+ return VB2_ERROR_MOCK;
+ case HWCRYPTO_ABORT:
+ vb2ex_abort();
+ /* shouldn't reach here but added for compiler */
+ return VB2_ERROR_MOCK;
+ }
+ return VB2_ERROR_MOCK;
+}
+
+static void reset_common_data(enum hwcrypto_state state)
+{
+ hwcrypto_state = state;
memset(&mock_hash, 0xaa, sizeof(mock_hash));
+}
- mock_init_rv = VB2_SUCCESS;
- mock_extend_rv = VB2_SUCCESS;
- mock_finalize_rv = VB2_SUCCESS;
+void vb2_sha1_init(struct vb2_sha1_context *ctx)
+{
+ TEST_TRUE(hwcrypto_state == HWCRYPTO_NOTSUPPORTED ||
+ hwcrypto_state == HWCRYPTO_ABORT,
+ " hwcrypto_state in SW init");
}
-vb2_error_t vb2_digest_init(struct vb2_digest_context *dc,
- enum vb2_hash_algorithm hash_alg)
+void vb2_sha1_update(struct vb2_sha1_context *ctx,
+ const uint8_t *data,
+ uint32_t size)
{
- if (hash_alg != VB2_HASH_SHA1)
- return VB2_ERROR_MOCK;
- return mock_init_rv;
+ TEST_TRUE(hwcrypto_state == HWCRYPTO_NOTSUPPORTED ||
+ hwcrypto_state == HWCRYPTO_ABORT,
+ " hwcrypto_state in SW extend");
+ TEST_PTR_EQ(data, mock_buffer, " digest_extend buf");
+ TEST_EQ(size, sizeof(mock_buffer), " digest_extend size");
+}
+
+void vb2_sha1_finalize(struct vb2_sha1_context *ctx, uint8_t *digest)
+{
+ TEST_TRUE(hwcrypto_state == HWCRYPTO_NOTSUPPORTED ||
+ hwcrypto_state == HWCRYPTO_ABORT,
+ " hwcrypto_state in SW finalize");
+ memcpy(digest, mock_sha1, sizeof(mock_sha1));
}
-vb2_error_t vb2_digest_extend(struct vb2_digest_context *dc, const uint8_t *buf,
- uint32_t size)
+vb2_error_t vb2ex_hwcrypto_digest_init(enum vb2_hash_algorithm hash_alg,
+ uint32_t data_size)
{
- TEST_PTR_EQ(buf, mock_buffer, "digest_extend unexpected buf");
- TEST_EQ(size, sizeof(mock_buffer), "digest_extend unexpected size");
- return mock_extend_rv;
+ if (data_size)
+ TEST_EQ(data_size, sizeof(mock_buffer),
+ " hwcrypto_digest_init size");
+ return hwcrypto_mock(&hwcrypto_state);
}
-vb2_error_t vb2_digest_finalize(struct vb2_digest_context *dc, uint8_t *digest,
- uint32_t size)
+vb2_error_t vb2ex_hwcrypto_digest_extend(const uint8_t *buf, uint32_t size)
{
- TEST_EQ(size, VB2_SHA1_DIGEST_SIZE, "digest_finalize unexpected size");
- memcpy(digest, mock_sha1, size);
- return mock_finalize_rv;
+ TEST_PTR_EQ(buf, mock_buffer, " hwcrypto_digest_extend buf");
+ TEST_EQ(size, sizeof(mock_buffer), " hwcrypto_digest_extend size");
+ return hwcrypto_mock(&hwcrypto_state);
+}
+
+vb2_error_t vb2ex_hwcrypto_digest_finalize(uint8_t *digest,
+ uint32_t digest_size)
+{
+ memcpy(digest, mock_sha1, sizeof(mock_sha1));
+ return hwcrypto_mock(&hwcrypto_state);
}
static void vb2_hash_cbfs_compatibility_test(void)
@@ -73,56 +117,93 @@ static void vb2_hash_cbfs_compatibility_test(void)
static void vb2_hash_calculate_tests(void)
{
- reset_common_data();
- TEST_SUCC(vb2_hash_calculate(&mock_buffer, sizeof(mock_buffer),
+ reset_common_data(HWCRYPTO_ABORT);
+ TEST_SUCC(vb2_hash_calculate(false, &mock_buffer, sizeof(mock_buffer),
VB2_HASH_SHA1, &mock_hash),
"hash_calculate success");
TEST_SUCC(memcmp(mock_hash.sha1, mock_sha1, sizeof(mock_sha1)),
" got the right hash");
TEST_EQ(mock_hash.algo, VB2_HASH_SHA1, " set algo correctly");
- reset_common_data();
- mock_init_rv = VB2_ERROR_MOCK;
- TEST_EQ(vb2_hash_calculate(mock_buffer, sizeof(mock_buffer),
- VB2_HASH_SHA1, &mock_hash),
- VB2_ERROR_MOCK, "hash_calculate init error");
-
- reset_common_data();
- mock_extend_rv = VB2_ERROR_MOCK;
- TEST_EQ(vb2_hash_calculate(mock_buffer, sizeof(mock_buffer),
- VB2_HASH_SHA1, &mock_hash),
- VB2_ERROR_MOCK, "hash_calculate extend error");
-
- reset_common_data();
- mock_finalize_rv = VB2_ERROR_MOCK;
- TEST_EQ(vb2_hash_calculate(mock_buffer, sizeof(mock_buffer),
- VB2_HASH_SHA1, &mock_hash),
- VB2_ERROR_MOCK, "hash_calculate finalize error");
+ reset_common_data(HWCRYPTO_ABORT);
+ TEST_EQ(vb2_hash_calculate(false, mock_buffer, sizeof(mock_buffer),
+ -1, &mock_hash),
+ VB2_ERROR_SHA_INIT_ALGORITHM, "hash_calculate wrong algo");
}
static void vb2_hash_verify_tests(void)
{
- reset_common_data();
+ reset_common_data(HWCRYPTO_ABORT);
memcpy(mock_hash.sha1, mock_sha1, sizeof(mock_sha1));
mock_hash.algo = VB2_HASH_SHA1;
- TEST_SUCC(vb2_hash_verify(mock_buffer, sizeof(mock_buffer),
+ TEST_SUCC(vb2_hash_verify(false, mock_buffer, sizeof(mock_buffer),
&mock_hash), "hash_verify success");
memcpy(mock_hash.sha1, mock_sha1, sizeof(mock_sha1));
- mock_hash.algo = VB2_HASH_SHA256;
- TEST_EQ(vb2_hash_verify(mock_buffer, sizeof(mock_buffer),
- &mock_hash), VB2_ERROR_MOCK,
+ mock_hash.algo = -1;
+ TEST_EQ(vb2_hash_verify(false, mock_buffer, sizeof(mock_buffer),
+ &mock_hash), VB2_ERROR_SHA_INIT_ALGORITHM,
"hash_verify wrong algo");
memcpy(mock_hash.sha1, mock_sha1, sizeof(mock_sha1));
mock_hash.sha1[5] = 0xfe;
mock_hash.algo = VB2_HASH_SHA1;
- TEST_EQ(vb2_hash_verify(mock_buffer, sizeof(mock_buffer),
+ TEST_EQ(vb2_hash_verify(false, mock_buffer, sizeof(mock_buffer),
&mock_hash), VB2_ERROR_SHA_MISMATCH,
"hash_verify mismatch");
}
+static void vb2_hash_hwcrypto_tests(void)
+{
+ struct vb2_digest_context dc;
+
+ reset_common_data(HWCRYPTO_OK);
+ TEST_SUCC(vb2_digest_init(&dc, true, VB2_HASH_SHA1,
+ sizeof(mock_buffer)),
+ "digest_init, HW enabled");
+ TEST_EQ(dc.using_hwcrypto, 1, " using_hwcrypto set");
+ TEST_SUCC(vb2_digest_extend(&dc, mock_buffer, sizeof(mock_buffer)),
+ "digest_extend, HW enabled");
+ TEST_SUCC(vb2_digest_finalize(&dc, mock_hash.raw, VB2_SHA1_DIGEST_SIZE),
+ "digest_finalize, HW enabled ");
+ TEST_SUCC(memcmp(mock_hash.sha1, mock_sha1, sizeof(mock_sha1)),
+ " got the right hash");
+
+ reset_common_data(HWCRYPTO_OK);
+ TEST_SUCC(vb2_hash_calculate(true, mock_buffer, sizeof(mock_buffer),
+ VB2_HASH_SHA1, &mock_hash),
+ "hash_calculate, HW enabled");
+ TEST_SUCC(memcmp(mock_hash.sha1, mock_sha1, sizeof(mock_sha1)),
+ " got the right hash");
+ TEST_EQ(mock_hash.algo, VB2_HASH_SHA1, " algo set");
+
+ reset_common_data(HWCRYPTO_ERROR);
+ TEST_EQ(vb2_hash_calculate(true, mock_buffer, sizeof(mock_buffer),
+ VB2_HASH_SHA1, &mock_hash),
+ VB2_ERROR_MOCK, "hash_calculate, HW error");
+
+ reset_common_data(HWCRYPTO_NOTSUPPORTED);
+ TEST_SUCC(vb2_hash_calculate(true, mock_buffer, sizeof(mock_buffer),
+ VB2_HASH_SHA1, &mock_hash),
+ "hash_calculate, HW unsupported");
+ TEST_SUCC(memcmp(mock_hash.sha1, mock_sha1, sizeof(mock_sha1)),
+ " got the right hash");
+
+ reset_common_data(HWCRYPTO_OK);
+ memcpy(mock_hash.sha1, mock_sha1, sizeof(mock_sha1));
+ mock_hash.algo = VB2_HASH_SHA1;
+ TEST_SUCC(vb2_hash_verify(true, mock_buffer, sizeof(mock_buffer),
+ &mock_hash), "hash_verify, HW enabled");
+
+ memcpy(mock_hash.sha1, mock_sha1, sizeof(mock_sha1));
+ mock_hash.sha1[5] = 0xfe;
+ mock_hash.algo = VB2_HASH_SHA1;
+ TEST_EQ(vb2_hash_verify(true, mock_buffer, sizeof(mock_buffer),
+ &mock_hash), VB2_ERROR_SHA_MISMATCH,
+ "hash_verify HW mismatch");
+}
+
int main(int argc, char *argv[])
{
TEST_EQ(sizeof(mock_hash),
@@ -132,6 +213,7 @@ int main(int argc, char *argv[])
vb2_hash_cbfs_compatibility_test();
vb2_hash_calculate_tests();
vb2_hash_verify_tests();
+ vb2_hash_hwcrypto_tests();
return gTestSuccess ? 0 : 255;
}