xtest: SDP basic tests TA to pseudo TA with SDP memref
This change relies on the OP-TEE core pseudo TA used for pseudo TA
invocation test. Its API is available from pta_invoke_tests.h.
Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org>
Reviewed-by: Jerome Forissier <jerome.forissier@linaro.org>
diff --git a/host/xtest/sdp_basic.c b/host/xtest/sdp_basic.c
index e9d5443..61f33ce 100644
--- a/host/xtest/sdp_basic.c
+++ b/host/xtest/sdp_basic.c
@@ -27,6 +27,7 @@
#include <err.h>
#include <fcntl.h>
+#include <pta_invoke_tests.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -85,6 +86,13 @@
#define DEFAULT_ION_HEAP_TYPE ION_HEAP_TYPE_UNMAPPED
+enum test_target_ta {
+ TEST_NS_TO_TA,
+ TEST_NS_TO_PTA,
+ TEST_TA_TO_TA,
+ TEST_TA_TO_PTA,
+};
+
int allocate_ion_buffer(size_t size, int heap_id)
{
struct ion_allocation_data alloc_data;
@@ -142,20 +150,36 @@
TEEC_FinalizeContext(&ctx->ctx);
}
-static int create_tee_ctx(struct tee_ctx *ctx)
+static int create_tee_ctx(struct tee_ctx *ctx, enum test_target_ta target_ta)
{
TEEC_Result teerc;
- TEEC_UUID uuid = TA_SDP_BASIC_UUID;
+ TEEC_UUID ta_uuid = TA_SDP_BASIC_UUID;
+ TEEC_UUID pta_uuid = PTA_INVOKE_TESTS_UUID;
+ TEEC_UUID *uuid;
uint32_t err_origin;
+ switch (target_ta) {
+ case TEST_NS_TO_TA:
+ case TEST_TA_TO_TA:
+ case TEST_TA_TO_PTA:
+ uuid = &ta_uuid;
+ break;
+ case TEST_NS_TO_PTA:
+ uuid = &pta_uuid;
+ break;
+ default:
+ return -1;
+ }
+
teerc = TEEC_InitializeContext(NULL, &ctx->ctx);
if (teerc != TEEC_SUCCESS)
return -1;
- teerc = TEEC_OpenSession(&ctx->ctx, &ctx->sess, &uuid,
+ teerc = TEEC_OpenSession(&ctx->ctx, &ctx->sess, uuid,
TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
if (teerc != TEEC_SUCCESS)
- fprintf(stderr, "Error: open session to SDP test TA failed %x %d\n",
+ fprintf(stderr, "Error: open session to target test %s failed %x %d\n",
+ (target_ta == TEST_NS_TO_PTA) ? "pTA" : "TA",
teerc, err_origin);
return (teerc == TEEC_SUCCESS) ? 0 : -1;
@@ -200,8 +224,24 @@
TEEC_Result teerc;
TEEC_Operation op;
uint32_t err_origin;
- unsigned cmd = ind ? TA_SDP_BASIC_CMD_INVOKE_INJECT :
- TA_SDP_BASIC_CMD_INJECT;
+ unsigned cmd;
+
+ switch (ind) {
+ case TEST_NS_TO_TA:
+ cmd = TA_SDP_BASIC_CMD_INJECT;
+ break;
+ case TEST_TA_TO_TA:
+ cmd = TA_SDP_BASIC_CMD_INVOKE_INJECT;
+ break;
+ case TEST_TA_TO_PTA:
+ cmd = TA_SDP_BASIC_CMD_PTA_INJECT;
+ break;
+ case TEST_NS_TO_PTA:
+ cmd = PTA_INVOKE_TESTS_CMD_COPY_NSEC_TO_SEC;
+ break;
+ default:
+ return -1;
+ }
memset(&op, 0, sizeof(op));
op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
@@ -230,8 +270,24 @@
TEEC_Result teerc;
TEEC_Operation op;
uint32_t err_origin;
- unsigned cmd = ind ? TA_SDP_BASIC_CMD_INVOKE_TRANSFORM :
- TA_SDP_BASIC_CMD_TRANSFORM;
+ unsigned cmd;
+
+ switch (ind) {
+ case TEST_NS_TO_TA:
+ cmd = TA_SDP_BASIC_CMD_TRANSFORM;
+ break;
+ case TEST_TA_TO_TA:
+ cmd = TA_SDP_BASIC_CMD_INVOKE_TRANSFORM;
+ break;
+ case TEST_TA_TO_PTA:
+ cmd = TA_SDP_BASIC_CMD_PTA_TRANSFORM;
+ break;
+ case TEST_NS_TO_PTA:
+ cmd = PTA_INVOKE_TESTS_CMD_READ_MODIFY_SEC;
+ break;
+ default:
+ return -1;
+ }
memset(&op, 0, sizeof(op));
op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT,
@@ -255,8 +311,24 @@
TEEC_Result teerc;
TEEC_Operation op;
uint32_t err_origin;
- unsigned cmd = ind ? TA_SDP_BASIC_CMD_INVOKE_DUMP :
- TA_SDP_BASIC_CMD_DUMP;
+ unsigned cmd;
+
+ switch (ind) {
+ case TEST_NS_TO_TA:
+ cmd = TA_SDP_BASIC_CMD_DUMP;
+ break;
+ case TEST_TA_TO_TA:
+ cmd = TA_SDP_BASIC_CMD_INVOKE_DUMP;
+ break;
+ case TEST_TA_TO_PTA:
+ cmd = TA_SDP_BASIC_CMD_PTA_DUMP;
+ break;
+ case TEST_NS_TO_PTA:
+ cmd = PTA_INVOKE_TESTS_CMD_COPY_SEC_TO_NSEC;
+ break;
+ default:
+ return -1;
+ }
memset(&op, 0, sizeof(op));
op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT,
@@ -350,7 +422,9 @@
}
-static int sdp_basic_test(size_t size, size_t loop, int ion_heap, int rnd_offset)
+static int sdp_basic_test(enum test_target_ta ta,
+ size_t size, size_t loop, int ion_heap,
+ int rnd_offset)
{
struct tee_ctx *ctx = NULL;
unsigned char *test_buf = NULL;
@@ -389,7 +463,7 @@
ctx = malloc(sizeof(*ctx));
if (!ctx)
goto out;
- if (create_tee_ctx(ctx))
+ if (create_tee_ctx(ctx, ta))
goto out;
if (tee_register_buffer(ctx, &shm_ref, fd))
goto out;
@@ -408,43 +482,15 @@
offset = (unsigned int)*ref_buf;
/* TA writes into SDP buffer */
- if (inject_sdp_data(ctx, test_buf, offset, size, shm_ref, 0))
+ if (inject_sdp_data(ctx, test_buf, offset, size, shm_ref, ta))
goto out;
/* TA reads/writes into SDP buffer */
- if (transform_sdp_data(ctx, offset, size, shm_ref, 0))
+ if (transform_sdp_data(ctx, offset, size, shm_ref, ta))
goto out;
/* TA reads into SDP buffer */
- if (dump_sdp_data(ctx, test_buf, offset, size, shm_ref, 0))
- goto out;
-
- /* check dumped data are the expected ones */
- if (check_sdp_dumped(ctx, ref_buf, size, test_buf)) {
- fprintf(stderr, "check SDP data: %d errors\n", err);
- goto out;
- }
- }
-
- /* invoke trusted application with secure buffer as memref parameter */
- for (loop_cnt = loop; loop_cnt; loop_cnt--) {
- /* get an buffer of random-like values */
- if (get_random_bytes((char *)ref_buf, size))
- goto out;
- memcpy(test_buf, ref_buf, size);
- /* random offset [0 255] */
- offset = (unsigned int)*ref_buf;
-
- /* TA writes into SDP buffer */
- if (inject_sdp_data(ctx, test_buf, offset, size, shm_ref, 1))
- goto out;
-
- /* TA reads/writes into SDP buffer */
- if (transform_sdp_data(ctx, offset, size, shm_ref, 1))
- goto out;
-
- /* TA reads into SDP buffer */
- if (dump_sdp_data(ctx, test_buf, offset, size, shm_ref, 1))
+ if (dump_sdp_data(ctx, test_buf, offset, size, shm_ref, ta))
goto out;
/* check dumped data are the expected ones */
@@ -537,9 +583,19 @@
}
}
- verbose("Secure Data Path basic accesses from trusted applications\n");
+ verbose("\nSecure Data Path basic accesses: NS invokes SDP TA\n");
+ if (sdp_basic_test(TEST_NS_TO_TA,
+ test_size, test_loop, ion_heap, rnd_offset))
+ return 1;
- if (sdp_basic_test(test_size, test_loop, ion_heap, rnd_offset))
+ verbose("\nSecure Data Path basic accesses: SDP TA invokes SDP TA\n");
+ if (sdp_basic_test(TEST_TA_TO_TA,
+ test_size, test_loop, ion_heap, rnd_offset))
+ return 1;
+
+ verbose("\nSecure Data Path basic accesses: SDP TA invokes SDP pTA\n");
+ if (sdp_basic_test(TEST_TA_TO_PTA,
+ test_size, test_loop, ion_heap, rnd_offset))
return 1;
return 0;