diff options
Diffstat (limited to 'tests/vb2_sha_api_tests.c')
-rw-r--r-- | tests/vb2_sha_api_tests.c | 178 |
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; } |