// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
/* Copyright 2020 IBM Corp. */
#define TPM_SKIBOOT
#include "secvar_common_test.c"
#include "../storage/secboot_tpm.c"
#include "../storage/fakenv_ops.c"
#include "../secvar_util.c"

char *secboot_buffer;

#define ARBITRARY_SECBOOT_SIZE 128000

const char *secvar_test_name = "secboot_tpm";

int flash_secboot_read(void *dst, uint32_t src, uint32_t len)
{
	memcpy(dst, secboot_buffer + src, len);
	return 0;
}

int flash_secboot_write(uint32_t dst, void *src, uint32_t len)
{
	memcpy(secboot_buffer + dst, src, len);
	return 0;
}

int flash_secboot_info(uint32_t *total_size)
{
	*total_size = ARBITRARY_SECBOOT_SIZE;
	return 0;
}

/* Toggle this to test the physical presence resetting */
bool phys_presence = false;
bool secvar_check_physical_presence(void)
{
	return phys_presence;
}

struct platform platform;

int run_test(void)
{
	int rc;
	struct secvar *tmp;

	secboot_buffer = zalloc(ARBITRARY_SECBOOT_SIZE);

	// Initialize and format the storage
	rc = secboot_tpm_store_init();
	ASSERT(OPAL_SUCCESS == rc);

	// Load the just-formatted empty section
	rc = secboot_tpm_load_bank(&variable_bank, SECVAR_VARIABLE_BANK);
	ASSERT(OPAL_SUCCESS == rc);
	ASSERT(0 == list_length(&variable_bank));

	// Add some test variables
	tmp = new_secvar("test", 5, "testdata", 8, 0);
	list_add_tail(&variable_bank, &tmp->link);

	tmp = new_secvar("foo", 3, "moredata", 8, 0);
	list_add_tail(&variable_bank, &tmp->link);

	// Add a priority variable, ensure that works
	tmp = new_secvar("priority", 9, "meep", 4, SECVAR_FLAG_PROTECTED);
	list_add_tail(&variable_bank, &tmp->link);

	// Add another one
	tmp = new_secvar("priority2", 9, "meep", 4, SECVAR_FLAG_PROTECTED);
	list_add_tail(&variable_bank, &tmp->link);

	ASSERT(4 == list_length(&variable_bank));

	// Write the bank
	rc = secboot_tpm_write_bank(&variable_bank, SECVAR_VARIABLE_BANK);
	ASSERT(OPAL_SUCCESS == rc);
	// should write to bank 1 first
	ASSERT(*((uint64_t*) secboot_image->bank[1]) != 0llu);
	ASSERT(*((uint64_t*) secboot_image->bank[0]) == 0llu);

	// Clear the variable list
	clear_bank_list(&variable_bank);
	ASSERT(0 == list_length(&variable_bank));

	// Load the bank
	rc = secboot_tpm_load_bank(&variable_bank, SECVAR_VARIABLE_BANK);
	ASSERT(OPAL_SUCCESS == rc);
	ASSERT(4 == list_length(&variable_bank));

	// Change a variable
	tmp = list_tail(&variable_bank, struct secvar, link);
	memcpy(tmp->data, "somethin", 8);

	// Write the bank
	rc = secboot_tpm_write_bank(&variable_bank, SECVAR_VARIABLE_BANK);
	ASSERT(OPAL_SUCCESS == rc);
	// should have data in both now
	ASSERT(*((uint64_t*) secboot_image->bank[0]) != 0llu);
	ASSERT(*((uint64_t*) secboot_image->bank[1]) != 0llu);

	clear_bank_list(&variable_bank);
	free(secboot_buffer);

	return 0;
}

int main(void)
{
	int rc = 0;

	list_head_init(&variable_bank);

	rc = run_test();

	if (rc)
		printf(COLOR_RED "FAILED" COLOR_RESET "\n");
	else
		printf(COLOR_GREEN "OK" COLOR_RESET "\n");

	free(tpmnv_vars_image);
	free(tpmnv_control_image);
	free(secboot_image);

	return rc;
}
