/* Copyright 2015 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 kernel secure storage library.
 */

#include "2api.h"
#include "2common.h"
#include "2crc8.h"
#include "2misc.h"
#include "2secdata.h"
#include "2secdata_struct.h"
#include "2sysincludes.h"
#include "test_common.h"
#include "vboot_test.h"

static uint8_t workbuf[VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE]
	__attribute__((aligned(VB2_WORKBUF_ALIGN)));
static struct vb2_context *ctx;
static struct vb2_shared_data *sd;
static struct vb2_secdata_kernel_v0 *sec02;
static struct vb2_secdata_kernel_v1 *sec10;

static void reset_common_data(void)
{
	memset(workbuf, 0xaa, sizeof(workbuf));
	TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
		  "vb2api_init failed");

	sd = vb2_get_sd(ctx);

	sec02 = (struct vb2_secdata_kernel_v0 *)ctx->secdata_kernel;
	sec10 = (struct vb2_secdata_kernel_v1 *)ctx->secdata_kernel;
}

static void test_init(struct vb2_shared_data *s, int init, const char *why)
{
	if (init)
		TEST_NEQ(s->status & VB2_SD_STATUS_SECDATA_KERNEL_INIT, 0, why);
	else
		TEST_EQ(s->status & VB2_SD_STATUS_SECDATA_KERNEL_INIT, 0, why);
}

static void test_changed(struct vb2_context *c, int changed, const char *why)
{
	if (changed)
		TEST_NEQ(c->flags & VB2_CONTEXT_SECDATA_KERNEL_CHANGED, 0, why);
	else
		TEST_EQ(c->flags & VB2_CONTEXT_SECDATA_KERNEL_CHANGED, 0, why);

	c->flags &= ~VB2_CONTEXT_SECDATA_KERNEL_CHANGED;
}

/*
 * Version-independent tests
 */
static void secdata_kernel_test(void)
{
	uint8_t size;

	reset_common_data();

	/* Blank data is invalid */
	size = VB2_SECDATA_KERNEL_MIN_SIZE;
	memset(&ctx->secdata_kernel, 0xa6, size);
	TEST_EQ(vb2api_secdata_kernel_check(ctx, &size),
		VB2_ERROR_SECDATA_KERNEL_VERSION, "Check blank bad version");
	TEST_EQ(vb2_secdata_kernel_init(ctx),
		VB2_ERROR_SECDATA_KERNEL_VERSION, "Init blank bad version");
	test_init(sd, 0, "Init set SD status");

	/* Ensure zeroed buffers are invalid */
	size = VB2_SECDATA_KERNEL_MIN_SIZE;
	memset(&ctx->secdata_kernel, 0, size);
	TEST_EQ(vb2api_secdata_kernel_check(ctx, &size),
		VB2_ERROR_SECDATA_KERNEL_VERSION, "Check zero bad version");
	TEST_EQ(vb2_secdata_kernel_init(ctx),
		VB2_ERROR_SECDATA_KERNEL_VERSION, "Init zero incomplete");
	test_init(sd, 0, "Init set SD status");

	/* Read data less than minimum size */
	size = VB2_SECDATA_KERNEL_MIN_SIZE - 1;
	TEST_EQ(vb2api_secdata_kernel_check(ctx, &size),
		VB2_ERROR_SECDATA_KERNEL_INCOMPLETE, "Check incomplete");
	TEST_EQ(size, VB2_SECDATA_KERNEL_MIN_SIZE, "Return minimum size");
}

static void secdata_kernel_test_v10(void)
{
	uint8_t size;

	reset_common_data();

	/* Create good data */
	size = VB2_SECDATA_KERNEL_SIZE_V10;
	TEST_EQ(vb2api_secdata_kernel_create(ctx),
		VB2_SECDATA_KERNEL_SIZE_V10, "Create v1.0");
	TEST_SUCC(vb2api_secdata_kernel_check(ctx, &size), "Check created CRC");
	TEST_SUCC(vb2_secdata_kernel_init(ctx), "Init created CRC");
	test_init(sd, 1, "Init set SD status");
	test_changed(ctx, 1, "Create changes data");

	/* Check excessive data */
	size = VB2_SECDATA_KERNEL_SIZE_V10 + 1;
	TEST_SUCC(vb2api_secdata_kernel_check(ctx, &size),
		  "Check large v1.0 data");
	TEST_EQ(size, VB2_SECDATA_KERNEL_SIZE_V10, "Return expected size");

	/* Check incomplete data */
	size = VB2_SECDATA_KERNEL_SIZE_V10 - 1;
	vb2api_secdata_kernel_create(ctx);
	TEST_EQ(vb2api_secdata_kernel_check(ctx, &size),
		VB2_ERROR_SECDATA_KERNEL_INCOMPLETE, "Check incomplete");
	TEST_EQ(size, VB2_SECDATA_KERNEL_SIZE_V10, "Return expected size");

	reset_common_data();

	/* Bad version */
	size = VB2_SECDATA_KERNEL_SIZE_V10;
	vb2api_secdata_kernel_create(ctx);
	sec10->struct_version -= 1;
	TEST_EQ(vb2api_secdata_kernel_check(ctx, &size),
		VB2_ERROR_SECDATA_KERNEL_VERSION, "Check invalid version");
	TEST_EQ(vb2_secdata_kernel_init(ctx),
		VB2_ERROR_SECDATA_KERNEL_VERSION, "Init invalid version");
	test_init(sd, 0, "Init set SD status");

	/* Higher minor version */
	vb2api_secdata_kernel_create(ctx);
	sec10->struct_version += 1;
	TEST_SUCC(vb2api_secdata_kernel_check(ctx, &size), "Check v1.1 data");
	TEST_SUCC(vb2_secdata_kernel_init(ctx), "Init v1.1 data");
	test_init(sd, 1, "Init set SD status");

	reset_common_data();

	/* Higher major version */
	vb2api_secdata_kernel_create(ctx);
	sec10->struct_version += 0x10;
	TEST_EQ(vb2api_secdata_kernel_check(ctx, &size),
		VB2_ERROR_SECDATA_KERNEL_VERSION, "Check v2.0 data");
	TEST_EQ(vb2_secdata_kernel_init(ctx),
		VB2_ERROR_SECDATA_KERNEL_VERSION, "Init v2.0 data");
	test_init(sd, 0, "Init set SD status");

	reset_common_data();

	/* Corrupt data */
	size = VB2_SECDATA_KERNEL_SIZE_V10;
	vb2api_secdata_kernel_create(ctx);
	sec10->kernel_versions++;
	TEST_EQ(vb2api_secdata_kernel_check(ctx, &size),
		VB2_ERROR_SECDATA_KERNEL_CRC, "Check invalid CRC");
	TEST_EQ(vb2_secdata_kernel_init(ctx),
		VB2_ERROR_SECDATA_KERNEL_CRC, "Init invalid CRC");
	test_init(sd, 0, "Init set SD status");
}

static void secdata_kernel_test_v02(void)
{
	uint8_t size;

	reset_common_data();

	/* Create good data */
	size = VB2_SECDATA_KERNEL_SIZE_V02;
	TEST_EQ(vb2api_secdata_kernel_create_v0(ctx), size, "Create v0.2");
	TEST_SUCC(vb2api_secdata_kernel_check(ctx, &size), "Check v0.2");
	TEST_SUCC(vb2_secdata_kernel_init(ctx), "Init created CRC");
	test_init(sd, 1, "Init set SD status");

	/* Check excessive data */
	size = VB2_SECDATA_KERNEL_SIZE_V02 + 1;
	TEST_SUCC(vb2api_secdata_kernel_check(ctx, &size),
		  "Check large v0.2 data");
	TEST_EQ(size, VB2_SECDATA_KERNEL_SIZE_V02, "Return expected size");

	/* Check incomplete data */
	size = VB2_SECDATA_KERNEL_SIZE_V02 - 1;
	TEST_EQ(vb2api_secdata_kernel_check(ctx, &size),
		VB2_ERROR_SECDATA_KERNEL_INCOMPLETE, "Check small v0.2 data");
	TEST_EQ(size, VB2_SECDATA_KERNEL_SIZE_V02, "Return expected size");
	reset_common_data();

	/* Corrupt data */
	vb2api_secdata_kernel_create_v0(ctx);
	sec02->kernel_versions++;
	TEST_EQ(vb2api_secdata_kernel_check(ctx, &size),
		VB2_ERROR_SECDATA_KERNEL_CRC, "Check invalid CRC");
	TEST_EQ(vb2_secdata_kernel_init(ctx),
		VB2_ERROR_SECDATA_KERNEL_CRC, "Init invalid CRC");
}

static void secdata_kernel_access_test_v10(void)
{
	uint32_t v = 1;
	const uint8_t *p;
	uint8_t ec_hash[VB2_SHA256_DIGEST_SIZE];

	reset_common_data();

	/* Read/write versions */
	vb2api_secdata_kernel_create(ctx);
	vb2_secdata_kernel_init(ctx);
	ctx->flags = 0;
	v = vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_VERSIONS);
	TEST_EQ(v, 0, "Versions created 0");
	test_changed(ctx, 0, "Get doesn't change data");
	vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_VERSIONS, 0x123456ff);
	test_changed(ctx, 1, "Set changes data");
	vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_VERSIONS, 0x123456ff);
	test_changed(ctx, 0, "Set again doesn't change data");
	v = vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_VERSIONS);
	TEST_EQ(v, 0x123456ff, "Versions changed");

	/* Read/write flags */
	vb2api_secdata_kernel_create(ctx);
	vb2_secdata_kernel_init(ctx);
	ctx->flags = 0;
	v = vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_FLAGS);
	TEST_EQ(v, 0, "Flags created 0");
	test_changed(ctx, 0, "Get doesn't change data");
	vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_FLAGS, 0x12);
	test_changed(ctx, 1, "Set changes data");
	vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_FLAGS, 0x12);
	test_changed(ctx, 0, "Set again doesn't change data");
	v = vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_FLAGS);
	TEST_EQ(v, 0x12, "Flags changed");
	TEST_ABORT(vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_FLAGS, 0x100),
		   "Bad flags");

	/* Invalid field fails */
	TEST_ABORT(vb2_secdata_kernel_get(ctx, -1), "Get invalid");
	TEST_ABORT(vb2_secdata_kernel_set(ctx, -1, 456), "Set invalid");
	test_changed(ctx, 0, "Set invalid field doesn't change data");

	/* Read/write uninitialized data fails */
	sd->status &= ~VB2_SD_STATUS_SECDATA_KERNEL_INIT;
	TEST_ABORT(vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_VERSIONS),
		   "Get uninitialized");
	test_changed(ctx, 0, "Get uninitialized doesn't change data");
	TEST_ABORT(vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_VERSIONS,
					  0x123456ff),
		   "Set uninitialized");
	test_changed(ctx, 0, "Set uninitialized doesn't change data");

	/* Test EC hash set */
	vb2api_secdata_kernel_create(ctx);
	vb2_secdata_kernel_init(ctx);
	memset(ec_hash, 0xaa, sizeof(ec_hash));
	vb2_secdata_kernel_set_ec_hash(ctx, ec_hash);
	TEST_EQ(memcmp(ec_hash, sec10->ec_hash, sizeof(ec_hash)), 0,
		       "Check EC hash");
	test_changed(ctx, 1, "Set EC hash changes data");

	sec10->struct_version = VB2_SECDATA_KERNEL_VERSION_V02;
	TEST_ABORT(vb2_secdata_kernel_set_ec_hash(ctx, ec_hash),
		   "Can't set EC hash for v0.2");
	test_changed(ctx, 0, "Failing to set EC hash doesn't change data");
	sec10->struct_version = VB2_SECDATA_KERNEL_VERSION_V10;

	sd->status &= ~VB2_SD_STATUS_SECDATA_KERNEL_INIT;
	TEST_ABORT(vb2_secdata_kernel_set_ec_hash(ctx, ec_hash),
		   "Can't set EC hash before init");
	sd->status |= VB2_SD_STATUS_SECDATA_KERNEL_INIT;

	/* Test EC hash get */
	p = vb2_secdata_kernel_get_ec_hash(ctx);
	TEST_PTR_EQ(p, sec10->ec_hash, "Get EC hash returns pointer");
	test_changed(ctx, 0, "Get EC hash doesn't change data");

	sec10->struct_version = VB2_SECDATA_KERNEL_VERSION_V02;
	TEST_PTR_EQ(vb2_secdata_kernel_get_ec_hash(ctx), NULL,
		    "Can't get EC hash for v0.2");
	sec10->struct_version = VB2_SECDATA_KERNEL_VERSION_V10;

	sd->status &= ~VB2_SD_STATUS_SECDATA_KERNEL_INIT;
	TEST_ABORT(vb2_secdata_kernel_get_ec_hash(ctx),
		   "Can't get EC hash before init");
	sd->status |= VB2_SD_STATUS_SECDATA_KERNEL_INIT;
}

static void secdata_kernel_access_test_v02(void)
{
	uint32_t v = 1;
	reset_common_data();

	/* Read/write versions */
	vb2api_secdata_kernel_create_v0(ctx);
	vb2_secdata_kernel_init(ctx);
	ctx->flags = 0;
	v = vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_VERSIONS);
	TEST_EQ(v, 0, "Versions created 0");
	test_changed(ctx, 0, "Get doesn't change data");
	vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_VERSIONS, 0x123456ff);
	test_changed(ctx, 1, "Set changes data");
	vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_VERSIONS, 0x123456ff);
	test_changed(ctx, 0, "Set again doesn't change data");
	v = vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_VERSIONS);
	TEST_EQ(v, 0x123456ff, "Versions changed");

	/* Read/write flags: should be no-op for v0 */
	TEST_EQ(vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_FLAGS), 0,
		"Get flags");
	vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_FLAGS, 0x1);
	TEST_EQ(vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_FLAGS), 0,
		"Get flags again");

	/* Invalid field fails */
	TEST_ABORT(vb2_secdata_kernel_get(ctx, -1), "Get invalid");
	TEST_ABORT(vb2_secdata_kernel_set(ctx, -1, 456), "Set invalid");
	test_changed(ctx, 0, "Set invalid field doesn't change data");

	/* Read/write uninitialized data fails */
	sd->status &= ~VB2_SD_STATUS_SECDATA_KERNEL_INIT;
	TEST_ABORT(vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_VERSIONS),
		   "Get uninitialized");
	test_changed(ctx, 0, "Get uninitialized doesn't change data");
	TEST_ABORT(vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_VERSIONS,
					  0x123456ff),
		   "Set uninitialized");
	test_changed(ctx, 0, "Set uninitialized doesn't change data");
}

int main(int argc, char* argv[])
{
	secdata_kernel_test();
	secdata_kernel_test_v10();
	secdata_kernel_test_v02();
	secdata_kernel_access_test_v10();
	secdata_kernel_access_test_v02();

	return gTestSuccess ? 0 : 255;
}
