drivers: tee: sandbox: SCP03 control emulator
authorJorge Ramirez-Ortiz <jorge@foundries.io>
Sun, 14 Feb 2021 15:27:25 +0000 (16:27 +0100)
committerTom Rini <trini@konsulko.com>
Sun, 14 Mar 2021 15:50:13 +0000 (11:50 -0400)
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>
drivers/tee/optee/Kconfig
drivers/tee/sandbox.c

index 65622f3..d030280 100644 (file)
@@ -31,6 +31,12 @@ config OPTEE_TA_RPC_TEST
          permits to test reverse RPC calls to TEE supplicant. Should
          be used only in sandbox env.
 
          permits to test reverse RPC calls to TEE supplicant. Should
          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
 
 endif
 endmenu
 
 endif
index 3a1d34d..35e8542 100644 (file)
@@ -8,6 +8,7 @@
 #include <tee.h>
 #include <tee/optee_ta_avb.h>
 #include <tee/optee_ta_rpc_test.h>
 #include <tee.h>
 #include <tee/optee_ta_avb.h>
 #include <tee/optee_ta_rpc_test.h>
+#include <tee/optee_ta_scp03.h>
 
 #include "optee/optee_msg.h"
 #include "optee/optee_private.h"
 
 #include "optee/optee_msg.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)
 {
        if (n >= num_params)
 static u32 get_attr(uint n, uint num_params, struct tee_param *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,
                        struct tee_param *params)
 {
 static u32 check_params(u8 p0, u8 p1, u8 p2, u8 p3, uint num_params,
                        struct tee_param *params)
 {
-       u8 p[] = { p0, p1, p2, p3};
+       u8 p[] = { p0, p1, p2, p3 };
        uint n;
 
        for (n = 0; n < ARRAY_SIZE(p); n++)
        uint 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
 static u32 ta_avb_open_session(struct udevice *dev, uint num_params,
 
 #ifdef CONFIG_OPTEE_TA_AVB
 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,
        },
 #endif
          .invoke_func = ta_rpc_test_invoke_func,
        },
 #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,