126 lines
3 KiB
C
126 lines
3 KiB
C
// 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;
|
|
}
|