blob: cb58f7bcb45bf3328af199783b30f4dde1ed8587 [file] [log] [blame]
/* Copyright 2019 The Chromium OS Authors. All rights reserved.
* 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.
*/
#include "2return_codes.h"
#include "2sha.h"
#include "2sysincludes.h"
#include "test_common.h"
uint8_t mock_sha1[] = {0x1, 0x3, 0x5, 0x2, 0x4, 0x6, 0xa, 0xb, 0xc, 0xd,
0xd, 0xe, 0xa, 0xd, 0xb, 0xe, 0xe, 0xf, 0x0, 0xf0};
_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 void reset_common_data(void)
{
memset(&mock_hash, 0xaa, sizeof(mock_hash));
mock_init_rv = VB2_SUCCESS;
mock_extend_rv = VB2_SUCCESS;
mock_finalize_rv = VB2_SUCCESS;
}
vb2_error_t vb2_digest_init(struct vb2_digest_context *dc,
enum vb2_hash_algorithm hash_alg)
{
if (hash_alg != VB2_HASH_SHA1)
return VB2_ERROR_MOCK;
return mock_init_rv;
}
vb2_error_t vb2_digest_extend(struct vb2_digest_context *dc, const uint8_t *buf,
uint32_t 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;
}
vb2_error_t vb2_digest_finalize(struct vb2_digest_context *dc, uint8_t *digest,
uint32_t size)
{
TEST_EQ(size, VB2_SHA1_DIGEST_SIZE, "digest_finalize unexpected size");
memcpy(digest, mock_sha1, size);
return mock_finalize_rv;
}
static void vb2_hash_cbfs_compatibility_test(void)
{
/* 'algo' used to be represented as a 4-byte big-endian in CBFS. Confirm
that the new representation is binary compatible for small values. */
union {
struct vb2_hash hash;
struct {
uint32_t be32;
uint8_t bytes[0];
};
} test = {0};
test.be32 = htobe32(0xa5);
TEST_EQ(test.hash.algo, 0xa5, "vb2_hash algo compatible to CBFS attr");
TEST_PTR_EQ(&test.hash.raw, &test.bytes, " digest offset matches");
}
static void vb2_hash_calculate_tests(void)
{
reset_common_data();
TEST_SUCC(vb2_hash_calculate(&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");
}
static void vb2_hash_verify_tests(void)
{
reset_common_data();
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),
&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,
"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),
&mock_hash), VB2_ERROR_SHA_MISMATCH,
"hash_verify mismatch");
}
int main(int argc, char *argv[])
{
TEST_EQ(sizeof(mock_hash),
offsetof(struct vb2_hash, raw) + VB2_SHA512_DIGEST_SIZE,
"tests run with all SHA algorithms enabled");
vb2_hash_cbfs_compatibility_test();
vb2_hash_calculate_tests();
vb2_hash_verify_tests();
return gTestSuccess ? 0 : 255;
}