Merge tag 'tpm-for_tom-13062023' of https://source.denx.de/u-boot/custodians/u-boot-tpm into next
tpm autostart
This commit is contained in:
@@ -11,6 +11,7 @@
|
|||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <tpm-common.h>
|
#include <tpm-common.h>
|
||||||
|
#include <tpm_api.h>
|
||||||
#include "tpm-user-utils.h"
|
#include "tpm-user-utils.h"
|
||||||
|
|
||||||
static struct udevice *tpm_dev;
|
static struct udevice *tpm_dev;
|
||||||
@@ -367,6 +368,21 @@ int do_tpm_init(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
|||||||
return report_return_code(tpm_init(dev));
|
return report_return_code(tpm_init(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int do_tpm_autostart(struct cmd_tbl *cmdtp, int flag, int argc,
|
||||||
|
char *const argv[])
|
||||||
|
{
|
||||||
|
struct udevice *dev;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (argc != 1)
|
||||||
|
return CMD_RET_USAGE;
|
||||||
|
rc = get_tpm(&dev);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
return report_return_code(tpm_auto_start(dev));
|
||||||
|
}
|
||||||
|
|
||||||
int do_tpm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
int do_tpm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
||||||
{
|
{
|
||||||
struct cmd_tbl *tpm_commands, *cmd;
|
struct cmd_tbl *tpm_commands, *cmd;
|
||||||
|
@@ -20,6 +20,7 @@ int get_tpm(struct udevice **devp);
|
|||||||
int do_tpm_device(struct cmd_tbl *cmdtp, int flag, int argc,
|
int do_tpm_device(struct cmd_tbl *cmdtp, int flag, int argc,
|
||||||
char *const argv[]);
|
char *const argv[]);
|
||||||
int do_tpm_init(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
|
int do_tpm_init(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
|
||||||
|
int do_tpm_autostart(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
|
||||||
int do_tpm_info(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
|
int do_tpm_info(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
|
||||||
int do_tpm_report_state(struct cmd_tbl *cmdtp, int flag, int argc,
|
int do_tpm_report_state(struct cmd_tbl *cmdtp, int flag, int argc,
|
||||||
char *const argv[]);
|
char *const argv[]);
|
||||||
|
@@ -655,6 +655,7 @@ TPM_COMMAND_NO_ARG(tpm_physical_disable)
|
|||||||
static struct cmd_tbl tpm1_commands[] = {
|
static struct cmd_tbl tpm1_commands[] = {
|
||||||
U_BOOT_CMD_MKENT(device, 0, 1, do_tpm_device, "", ""),
|
U_BOOT_CMD_MKENT(device, 0, 1, do_tpm_device, "", ""),
|
||||||
U_BOOT_CMD_MKENT(info, 0, 1, do_tpm_info, "", ""),
|
U_BOOT_CMD_MKENT(info, 0, 1, do_tpm_info, "", ""),
|
||||||
|
U_BOOT_CMD_MKENT(init, 0, 1, do_tpm_autostart, "", ""),
|
||||||
U_BOOT_CMD_MKENT(init, 0, 1, do_tpm_init, "", ""),
|
U_BOOT_CMD_MKENT(init, 0, 1, do_tpm_init, "", ""),
|
||||||
U_BOOT_CMD_MKENT(startup, 0, 1,
|
U_BOOT_CMD_MKENT(startup, 0, 1,
|
||||||
do_tpm_startup, "", ""),
|
do_tpm_startup, "", ""),
|
||||||
@@ -733,6 +734,9 @@ U_BOOT_CMD(tpm, CONFIG_SYS_MAXARGS, 1, do_tpm,
|
|||||||
" device [num device]\n"
|
" device [num device]\n"
|
||||||
" - Show all devices or set the specified device\n"
|
" - Show all devices or set the specified device\n"
|
||||||
" info - Show information about the TPM\n"
|
" info - Show information about the TPM\n"
|
||||||
|
" autostart\n"
|
||||||
|
" - Initalize the tpm, perform a Startup(clear) and run a full selftest\n"
|
||||||
|
" sequence\n"
|
||||||
" init\n"
|
" init\n"
|
||||||
" - Put TPM into a state where it waits for 'startup' command.\n"
|
" - Put TPM into a state where it waits for 'startup' command.\n"
|
||||||
" startup mode\n"
|
" startup mode\n"
|
||||||
|
@@ -370,6 +370,7 @@ static struct cmd_tbl tpm2_commands[] = {
|
|||||||
U_BOOT_CMD_MKENT(dam_reset, 0, 1, do_tpm_dam_reset, "", ""),
|
U_BOOT_CMD_MKENT(dam_reset, 0, 1, do_tpm_dam_reset, "", ""),
|
||||||
U_BOOT_CMD_MKENT(dam_parameters, 0, 1, do_tpm_dam_parameters, "", ""),
|
U_BOOT_CMD_MKENT(dam_parameters, 0, 1, do_tpm_dam_parameters, "", ""),
|
||||||
U_BOOT_CMD_MKENT(change_auth, 0, 1, do_tpm_change_auth, "", ""),
|
U_BOOT_CMD_MKENT(change_auth, 0, 1, do_tpm_change_auth, "", ""),
|
||||||
|
U_BOOT_CMD_MKENT(autostart, 0, 1, do_tpm_autostart, "", ""),
|
||||||
U_BOOT_CMD_MKENT(pcr_setauthpolicy, 0, 1,
|
U_BOOT_CMD_MKENT(pcr_setauthpolicy, 0, 1,
|
||||||
do_tpm_pcr_setauthpolicy, "", ""),
|
do_tpm_pcr_setauthpolicy, "", ""),
|
||||||
U_BOOT_CMD_MKENT(pcr_setauthvalue, 0, 1,
|
U_BOOT_CMD_MKENT(pcr_setauthvalue, 0, 1,
|
||||||
@@ -392,8 +393,13 @@ U_BOOT_CMD(tpm2, CONFIG_SYS_MAXARGS, 1, do_tpm, "Issue a TPMv2.x command",
|
|||||||
" Show information about the TPM.\n"
|
" Show information about the TPM.\n"
|
||||||
"state\n"
|
"state\n"
|
||||||
" Show internal state from the TPM (if available)\n"
|
" Show internal state from the TPM (if available)\n"
|
||||||
|
"autostart\n"
|
||||||
|
" Initalize the tpm, perform a Startup(clear) and run a full selftest\n"
|
||||||
|
" sequence\n"
|
||||||
"init\n"
|
"init\n"
|
||||||
" Initialize the software stack. Always the first command to issue.\n"
|
" Initialize the software stack. Always the first command to issue.\n"
|
||||||
|
" 'tpm startup' is the only acceptable command after a 'tpm init' has been\n"
|
||||||
|
" issued\n"
|
||||||
"startup <mode>\n"
|
"startup <mode>\n"
|
||||||
" Issue a TPM2_Startup command.\n"
|
" Issue a TPM2_Startup command.\n"
|
||||||
" <mode> is one of:\n"
|
" <mode> is one of:\n"
|
||||||
|
@@ -41,11 +41,9 @@ def force_init(u_boot_console, force=False):
|
|||||||
skip_test = u_boot_console.config.env.get('env__tpm_device_test_skip', False)
|
skip_test = u_boot_console.config.env.get('env__tpm_device_test_skip', False)
|
||||||
if skip_test:
|
if skip_test:
|
||||||
pytest.skip('skip TPM device test')
|
pytest.skip('skip TPM device test')
|
||||||
output = u_boot_console.run_command('tpm2 init')
|
output = u_boot_console.run_command('tpm2 autostart')
|
||||||
if force or not 'Error' in output:
|
if force or not 'Error' in output:
|
||||||
u_boot_console.run_command('echo --- start of init ---')
|
u_boot_console.run_command('echo --- start of init ---')
|
||||||
u_boot_console.run_command('tpm2 startup TPM2_SU_CLEAR')
|
|
||||||
u_boot_console.run_command('tpm2 self_test full')
|
|
||||||
u_boot_console.run_command('tpm2 clear TPM2_RH_LOCKOUT')
|
u_boot_console.run_command('tpm2 clear TPM2_RH_LOCKOUT')
|
||||||
output = u_boot_console.run_command('echo $?')
|
output = u_boot_console.run_command('echo $?')
|
||||||
if not output.endswith('0'):
|
if not output.endswith('0'):
|
||||||
@@ -83,20 +81,13 @@ def tpm2_sandbox_init(u_boot_console):
|
|||||||
This allows all tests to run in parallel, since no test depends on another.
|
This allows all tests to run in parallel, since no test depends on another.
|
||||||
"""
|
"""
|
||||||
u_boot_console.restart_uboot()
|
u_boot_console.restart_uboot()
|
||||||
u_boot_console.run_command('tpm2 init')
|
u_boot_console.run_command('tpm2 autostart')
|
||||||
output = u_boot_console.run_command('echo $?')
|
output = u_boot_console.run_command('echo $?')
|
||||||
assert output.endswith('0')
|
assert output.endswith('0')
|
||||||
|
|
||||||
skip_test = u_boot_console.config.env.get('env__tpm_device_test_skip', False)
|
skip_test = u_boot_console.config.env.get('env__tpm_device_test_skip', False)
|
||||||
if skip_test:
|
if skip_test:
|
||||||
pytest.skip('skip TPM device test')
|
pytest.skip('skip TPM device test')
|
||||||
u_boot_console.run_command('tpm2 startup TPM2_SU_CLEAR')
|
|
||||||
output = u_boot_console.run_command('echo $?')
|
|
||||||
assert output.endswith('0')
|
|
||||||
|
|
||||||
u_boot_console.run_command('tpm2 self_test full')
|
|
||||||
output = u_boot_console.run_command('echo $?')
|
|
||||||
assert output.endswith('0')
|
|
||||||
|
|
||||||
@pytest.mark.buildconfigspec('cmd_tpm_v2')
|
@pytest.mark.buildconfigspec('cmd_tpm_v2')
|
||||||
def test_tpm2_sandbox_self_test_full(u_boot_console):
|
def test_tpm2_sandbox_self_test_full(u_boot_console):
|
||||||
@@ -281,6 +272,12 @@ def test_tpm2_pcr_extend(u_boot_console):
|
|||||||
force_init(u_boot_console)
|
force_init(u_boot_console)
|
||||||
ram = u_boot_utils.find_ram_base(u_boot_console)
|
ram = u_boot_utils.find_ram_base(u_boot_console)
|
||||||
|
|
||||||
|
read_pcr = u_boot_console.run_command('tpm2 pcr_read 0 0x%x' % (ram + 0x20))
|
||||||
|
output = u_boot_console.run_command('echo $?')
|
||||||
|
assert output.endswith('0')
|
||||||
|
str = re.findall(r'\d+ known updates', read_pcr)[0]
|
||||||
|
updates = int(re.findall(r'\d+', str)[0])
|
||||||
|
|
||||||
u_boot_console.run_command('tpm2 pcr_extend 0 0x%x' % ram)
|
u_boot_console.run_command('tpm2 pcr_extend 0 0x%x' % ram)
|
||||||
output = u_boot_console.run_command('echo $?')
|
output = u_boot_console.run_command('echo $?')
|
||||||
assert output.endswith('0')
|
assert output.endswith('0')
|
||||||
|
Reference in New Issue
Block a user