drivers: tee: sandbox: SCP03 control emulator

Adds support for a working SCP03 emulation. Input parameters are
validated however the commands (enable, provision) executed by the TEE
are assumed to always succeed.

Signed-off-by: Jorge Ramirez-Ortiz <jorge@foundries.io>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Jorge Ramirez-Ortiz 2021-02-14 16:27:25 +01:00 committed by Tom Rini
parent 26839e5dde
commit 5a8783c80c
2 changed files with 59 additions and 1 deletions

View File

@ -31,6 +31,12 @@ config OPTEE_TA_RPC_TEST
permits to test reverse RPC calls to TEE supplicant. Should permits to test reverse RPC calls to TEE supplicant. Should
be used only in sandbox env. be used only in sandbox env.
config OPTEE_TA_SCP03
bool "Support SCP03 TA"
default y
help
Enables support for controlling (enabling, provisioning) the
Secure Channel Protocol 03 operation in the OP-TEE SCP03 TA.
endmenu endmenu
endif endif

View File

@ -8,6 +8,7 @@
#include <tee.h> #include <tee.h>
#include <tee/optee_ta_avb.h> #include <tee/optee_ta_avb.h>
#include <tee/optee_ta_rpc_test.h> #include <tee/optee_ta_rpc_test.h>
#include <tee/optee_ta_scp03.h>
#include "optee/optee_msg.h" #include "optee/optee_msg.h"
#include "optee/optee_private.h" #include "optee/optee_private.h"
@ -68,6 +69,7 @@ void *optee_alloc_and_init_page_list(void *buf, ulong len,
return NULL; return NULL;
} }
#if defined(CONFIG_OPTEE_TA_SCP03) || defined(CONFIG_OPTEE_TA_AVB)
static u32 get_attr(uint n, uint num_params, struct tee_param *params) static u32 get_attr(uint n, uint num_params, struct tee_param *params)
{ {
if (n >= num_params) if (n >= num_params)
@ -79,7 +81,7 @@ static u32 get_attr(uint n, uint num_params, struct tee_param *params)
static u32 check_params(u8 p0, u8 p1, u8 p2, u8 p3, uint num_params, static u32 check_params(u8 p0, u8 p1, u8 p2, u8 p3, uint num_params,
struct tee_param *params) struct tee_param *params)
{ {
u8 p[] = { p0, p1, p2, p3}; u8 p[] = { p0, p1, p2, p3 };
uint n; uint n;
for (n = 0; n < ARRAY_SIZE(p); n++) for (n = 0; n < ARRAY_SIZE(p); n++)
@ -97,6 +99,50 @@ bad_params:
return TEE_ERROR_BAD_PARAMETERS; return TEE_ERROR_BAD_PARAMETERS;
} }
#endif
#ifdef CONFIG_OPTEE_TA_SCP03
static u32 pta_scp03_open_session(struct udevice *dev, uint num_params,
struct tee_param *params)
{
/*
* We don't expect additional parameters when opening a session to
* this TA.
*/
return check_params(TEE_PARAM_ATTR_TYPE_NONE, TEE_PARAM_ATTR_TYPE_NONE,
TEE_PARAM_ATTR_TYPE_NONE, TEE_PARAM_ATTR_TYPE_NONE,
num_params, params);
}
static u32 pta_scp03_invoke_func(struct udevice *dev, u32 func, uint num_params,
struct tee_param *params)
{
u32 res;
static bool enabled;
switch (func) {
case PTA_CMD_ENABLE_SCP03:
res = check_params(TEE_PARAM_ATTR_TYPE_VALUE_INPUT,
TEE_PARAM_ATTR_TYPE_NONE,
TEE_PARAM_ATTR_TYPE_NONE,
TEE_PARAM_ATTR_TYPE_NONE,
num_params, params);
if (res)
return res;
if (!enabled) {
enabled = true;
} else {
}
if (params[0].u.value.a)
return TEE_SUCCESS;
default:
return TEE_ERROR_NOT_SUPPORTED;
}
}
#endif
#ifdef CONFIG_OPTEE_TA_AVB #ifdef CONFIG_OPTEE_TA_AVB
static u32 ta_avb_open_session(struct udevice *dev, uint num_params, static u32 ta_avb_open_session(struct udevice *dev, uint num_params,
@ -357,6 +403,12 @@ static const struct ta_entry ta_entries[] = {
.invoke_func = ta_rpc_test_invoke_func, .invoke_func = ta_rpc_test_invoke_func,
}, },
#endif #endif
#ifdef CONFIG_OPTEE_TA_SCP03
{ .uuid = PTA_SCP03_UUID,
.open_session = pta_scp03_open_session,
.invoke_func = pta_scp03_invoke_func,
},
#endif
}; };
static void sandbox_tee_get_version(struct udevice *dev, static void sandbox_tee_get_version(struct udevice *dev,