Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,4 @@ endif(CCACHE_FOUND)

add_subdirectory (ta)
add_subdirectory (host/xtest)
add_subdirectory (host/supp_plugin)
12 changes: 11 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ endif
endif

-include $(TA_DEV_KIT_DIR)/host_include/conf.mk
-include $(OPTEE_CLIENT_EXPORT)/../optee_client_config.mk

ifneq ($V,1)
q := @
Expand All @@ -26,7 +27,7 @@ CROSS_COMPILE_TA ?= $(CROSS_COMPILE)

.PHONY: all
ifneq ($(wildcard $(TA_DEV_KIT_DIR)/host_include/conf.mk),)
all: xtest ta
all: xtest ta test_plugin
else
all:
$(q)echo "TA_DEV_KIT_DIR is not correctly defined" && false
Expand All @@ -45,11 +46,17 @@ ta:
O=$(out-dir) \
$@

.PHONY: test_plugin
test_plugin:
$(q)$(MAKE) -C host/supp_plugin CROSS_COMPILE="$(CROSS_COMPILE_HOST)" \
O=$(out-dir)

.PHONY: clean
ifneq ($(wildcard $(TA_DEV_KIT_DIR)/host_include/conf.mk),)
clean:
$(q)$(MAKE) -C host/xtest O=$(out-dir) $@
$(q)$(MAKE) -C ta O=$(out-dir) $@
$(q)$(MAKE) -C host/supp_plugin O=$(out-dir) $@
else
clean:
$(q)echo "TA_DEV_KIT_DIR is not correctly defined"
Expand All @@ -72,6 +79,9 @@ install:
$(echo) ' INSTALL ${DESTDIR}/bin'
$(q)mkdir -p ${DESTDIR}/bin
$(q)cp -a $(out-dir)/xtest/xtest ${DESTDIR}/bin
$(echo) ' INSTALL ${DESTDIR}/$(CFG_TEE_PLUGIN_LOAD_PATH)'
$(q)mkdir -p ${DESTDIR}/$(CFG_TEE_PLUGIN_LOAD_PATH)
$(q)cp $(out-dir)/supp_plugin/*.plugin ${DESTDIR}/$(CFG_TEE_PLUGIN_LOAD_PATH)

.PHONY: cscope
cscope:
Expand Down
9 changes: 9 additions & 0 deletions host/supp_plugin/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
project (f07bfc66-958c-4a15-99c0-260e4e7375dd.plugin C)

set (CFG_TEE_PLUGIN_LOAD_PATH "/usr/lib/tee-supplicant/plugins/")
set (CMAKE_SHARED_LIBRARY_PREFIX "")

add_library(${PROJECT_NAME} SHARED test_supp_plugin.c)
target_include_directories(${PROJECT_NAME} PRIVATE ./include)

install (TARGETS ${PROJECT_NAME} DESTINATION ${CFG_TEE_PLUGIN_LOAD_PATH})
22 changes: 22 additions & 0 deletions host/supp_plugin/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
PLUGIN_UUID = f07bfc66-958c-4a15-99c0-260e4e7375dd

PLUGIN = $(PLUGIN_UUID).plugin
PLUGIN_SRS = $(wildcard ./*.c)
PLUGIN_OBJ = $(patsubst %.c, $(O)/supp_plugin/%.o, $(PLUGIN_SRS))
PLUGIN_INCLUDES_DIR = $(CURDIR)/include $(OPTEE_CLIENT_EXPORT)/include

PLUGIN_INCLUDES = $(addprefix -I, $(PLUGIN_INCLUDES_DIR))
PLUGIN_CCFLAGS = -Wall -fPIC
PLUGIN_LDFLAGS = -shared

$(O)/supp_plugin/$(PLUGIN): $(PLUGIN_OBJ)
$(q)$(CROSS_COMPILE)gcc $(PLUGIN_LDFLAGS) $(PLUGIN_OBJ) -o $@

$(O)/supp_plugin/%.o: $(CURDIR)/%.c
$(q)mkdir -p $(O)/supp_plugin
@echo ' CC $<'
$(q)$(CROSS_COMPILE)gcc $(PLUGIN_INCLUDES) $(PLUGIN_CCFLAGS) -c $< -o $@

.PHONY: clean
clean:
$(q)$(RM) -rf $(O)/supp_plugin/
17 changes: 17 additions & 0 deletions host/supp_plugin/include/test_supp_plugin.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (c) 2021 Open Mobile Platform LLC
*/

#ifndef TEST_SUPP_PLUGIN_H
#define TEST_SUPP_PLUGIN_H

#define TEST_PLUGIN_UUID { 0xf07bfc66, 0x958c, 0x4a15, \
{ 0x99, 0xc0, 0x26, 0x0e, 0x4e, 0x73, 0x75, 0xdd } }

#define TEST_PLUGIN_CMD_PING 0
#define TEST_PLUGIN_CMD_PASS_VALUES 1
#define TEST_PLUGIN_CMD_WRITE_ARR 2
#define TEST_PLUGIN_CMD_GET_ARR 3

#endif /* TEST_SUPP_PLUGIN_H */
105 changes: 105 additions & 0 deletions host/supp_plugin/test_supp_plugin.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
// SPDX-License-Identifier: BSD-2-Clause
/*
* Copyright (c) 2021, Open Mobile Platform LLC
*/

#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <tee_plugin_method.h>
#include <test_supp_plugin.h>
#include <unistd.h>

static TEEC_Result pass_values(unsigned int sub_cmd, void *data,
size_t data_len, size_t *out_len)
{
struct add_op {
uint32_t a;
uint32_t b;
} *values = NULL;

values = (struct add_op *)data;
*out_len = sizeof(uint32_t);

if (sub_cmd == '+')
values->a = values->a + values->b;
else
values->a = values->a - values->b;

return TEEC_SUCCESS;
}

static TEEC_Result write_test_arr(unsigned int sub_cmd, void *data,
size_t data_len, size_t *out_len)
{
(void)sub_cmd;
(void)out_len;

int fd = -1;
int n = -1;
char template[] = "/tmp/testplugin-XXXXXX";
char fname[PATH_MAX] = { 0 };

strcpy(fname, template);

fd = mkstemp(fname);
if (fd < 0)
return TEEC_ERROR_GENERIC;

n = write(fd, (const void *)data, data_len);
if (n < 0) {
close(fd);
return TEEC_ERROR_GENERIC;
}

*out_len = sizeof(template);
memcpy(data, (const void *)fname, *out_len);
close(fd);

return TEEC_SUCCESS;
}

static TEEC_Result get_test_arr(unsigned int sub_cmd, void *data,
size_t data_len, size_t *out_len)
{
(void)sub_cmd;
char test_arr[] = "Array from plugin";
size_t test_size = sizeof(test_arr);

if (data_len < test_size)
return TEEC_ERROR_GENERIC;

memcpy(data, test_arr, test_size);
*out_len = test_size;

return TEEC_SUCCESS;
}

static TEEC_Result test_plugin_invoke(unsigned int cmd, unsigned int sub_cmd,
void *data, size_t data_len,
size_t *out_len)
{
switch (cmd) {
case TEST_PLUGIN_CMD_PING:
return TEEC_SUCCESS;
case TEST_PLUGIN_CMD_PASS_VALUES:
return pass_values(sub_cmd, data, data_len, out_len);
case TEST_PLUGIN_CMD_WRITE_ARR:
return write_test_arr(sub_cmd, data, data_len, out_len);
case TEST_PLUGIN_CMD_GET_ARR:
return get_test_arr(sub_cmd, data, data_len, out_len);
default:
break;
}

return TEEC_ERROR_NOT_SUPPORTED;
}

struct plugin_method plugin_method = {
.name = "test",
.uuid = TEST_PLUGIN_UUID,
.invoke = test_plugin_invoke,
};
1 change: 1 addition & 0 deletions host/xtest/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ target_compile_options (${PROJECT_NAME} PRIVATE -include conf.h)

target_include_directories(${PROJECT_NAME}
PRIVATE .
PRIVATE ../supp_plugin/include
PRIVATE adbg/include
PRIVATE ${OPTEE_TEST_SDK}/host_include
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
Expand Down
2 changes: 2 additions & 0 deletions host/xtest/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ objs := $(patsubst %.c,$(out-dir)/xtest/%.o, $(srcs))

CFLAGS += -I./
CFLAGS += -I./adbg/include
CFLAGS += -I../supp_plugin/include
CFLAGS += -I$(out-dir)/xtest

CFLAGS += -I$(OPTEE_CLIENT_EXPORT)/include
Expand All @@ -126,6 +127,7 @@ CFLAGS += -I../../ta/aes_perf/include
CFLAGS += -I../../ta/socket/include
CFLAGS += -I../../ta/sdp_basic/include
CFLAGS += -I../../ta/tpm_log_test/include
CFLAGS += -I../../ta/supp_plugin/include

TA_DIR ?= /lib/optee_armtz
CFLAGS += -DTA_DIR=\"$(TA_DIR)\"
Expand Down
140 changes: 140 additions & 0 deletions host/xtest/regression_1000.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* Copyright (c) 2014, STMicroelectronics International N.V.
*/

#include <errno.h>
#include <limits.h>
#include <pthread.h>
#include <stdio.h>
Expand All @@ -29,9 +30,12 @@
#include <ta_sims_keepalive_test.h>
#include <ta_concurrent.h>
#include <ta_tpm_log_test.h>
#include <ta_supp_plugin.h>
#include <sdp_basic.h>
#include <pta_secstor_ta_mgmt.h>

#include <test_supp_plugin.h>

#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
Expand Down Expand Up @@ -2345,3 +2349,139 @@ static void xtest_tee_test_1032(ADBG_Case_t *c)
}
ADBG_CASE_DEFINE(regression, 1032, xtest_tee_test_1032,
"Register read-only shared memory");

static void xtest_tee_test_1033(ADBG_Case_t *c)
{
TEEC_Session session = { };
uint32_t ret_orig = 0;

/* TA will ping the test plugin during open session operation */
if (!ADBG_EXPECT_TEEC_SUCCESS(c,
xtest_teec_open_session(&session, &supp_plugin_test_ta_uuid,
NULL, &ret_orig)))
return;

Do_ADBG_BeginSubCase(c, "Pass values to/from a plugin");
{
TEEC_Operation op = TEEC_OPERATION_INITIALIZER;

op.params[0].value.a = 20;
op.params[0].value.b = 10;
op.params[1].value.a = '+';
op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
TEEC_VALUE_INPUT, TEEC_NONE,
TEEC_NONE);

ADBG_EXPECT_TEEC_SUCCESS(c,
TEEC_InvokeCommand(&session,
TA_SUPP_PLUGIN_CMD_PASS_VALUES, &op,
&ret_orig));
ADBG_EXPECT(c, 30, op.params[0].value.a);

/* reassign, because the values was changed during previous op */
op.params[0].value.a = 20;
op.params[0].value.b = 10;
op.params[1].value.a = '-';
ADBG_EXPECT_TEEC_SUCCESS(c,
TEEC_InvokeCommand(&session,
TA_SUPP_PLUGIN_CMD_PASS_VALUES, &op,
&ret_orig));
ADBG_EXPECT(c, 10, op.params[0].value.a);
}
Do_ADBG_EndSubCase(c, "Pass values to/from a plugin");

Do_ADBG_BeginSubCase(c, "Pass array to a plugin");
{
TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
char to_plugin[] = "Plugin must write this array to the test file";
char from_file[sizeof(to_plugin)] = { };
char test_fname[PATH_MAX] = { };
FILE *fp = NULL;

op.params[0].tmpref.buffer = to_plugin;
op.params[0].tmpref.size = sizeof(to_plugin);
op.params[1].tmpref.buffer = test_fname;
op.params[1].tmpref.size = PATH_MAX;
op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
TEEC_MEMREF_TEMP_OUTPUT,
TEEC_NONE, TEEC_NONE);

ADBG_EXPECT_TEEC_SUCCESS(c,
TEEC_InvokeCommand(&session,
TA_SUPP_PLUGIN_CMD_WRITE_ARR,
&op, &ret_orig));

/*
* Test file is generated by the plugin with the help of
* mkstemp(). Check the file content here.
*/
fp = fopen(test_fname, "r");
ADBG_EXPECT_NOT_NULL(c, fp);
if (fp) {
fread(from_file, sizeof(char), sizeof(to_plugin), fp);
ADBG_EXPECT_EQUAL(c, to_plugin, from_file, sizeof(to_plugin));
fclose(fp);
remove(test_fname);
}
}
Do_ADBG_EndSubCase(c, "Pass array to a plugin");

Do_ADBG_BeginSubCase(c, "Get array from a plugin");
{
TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
char from_plugin[64] = { };
char expected_arr[] = "Array from plugin";
size_t expectes_size = sizeof(expected_arr);

op.params[0].tmpref.buffer = from_plugin;
op.params[0].tmpref.size = sizeof(from_plugin);
op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
TEEC_VALUE_OUTPUT, TEEC_NONE,
TEEC_NONE);
ADBG_EXPECT_TEEC_SUCCESS(c,
TEEC_InvokeCommand(&session,
TA_SUPP_PLUGIN_CMD_GET_ARR, &op,
&ret_orig));
ADBG_EXPECT(c, expectes_size, op.params[1].value.a);
ADBG_EXPECT_EQUAL(c, expected_arr, from_plugin, expectes_size);
}
Do_ADBG_EndSubCase(c, "Get array from a plugin");

Do_ADBG_BeginSubCase(c, "Not allow bad input to a plugin");
{
TEEC_Operation op = TEEC_OPERATION_INITIALIZER;

op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE,
TEEC_NONE, TEEC_NONE);
ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_BAD_PARAMETERS,
TEEC_InvokeCommand(&session,
TA_SUPP_PLUGIN_CMD_BAD_UUID, &op,
&ret_orig));
ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_BAD_PARAMETERS,
TEEC_InvokeCommand(&session,
TA_SUPP_PLUGIN_CMD_BAD_IN_DATA, &op,
&ret_orig));
ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_BAD_PARAMETERS,
TEEC_InvokeCommand(&session,
TA_SUPP_PLUGIN_CMD_BAD_IN_LEN, &op,
&ret_orig));
}
Do_ADBG_EndSubCase(c, "Not allow bad input to a plugin");

Do_ADBG_BeginSubCase(c, "Call an unknown plugin");
{
TEEC_Operation op = TEEC_OPERATION_INITIALIZER;

op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE,
TEEC_NONE, TEEC_NONE);
ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
TEEC_InvokeCommand(&session,
TA_SUPP_PLUGIN_CMD_UNKNOWN_UUID,
&op, &ret_orig));
}
Do_ADBG_EndSubCase(c, "Call an unknown plugin");

TEEC_CloseSession(&session);
}
ADBG_CASE_DEFINE(regression, 1033, xtest_tee_test_1033,
"Test the supplicant plugin framework");
Loading