From 62e081eef8654291ac85d3e5c1040d21a1f6b11a Mon Sep 17 00:00:00 2001 From: Ilias Apalodimas Date: Wed, 4 Jul 2018 13:49:20 +0300 Subject: Initial import, copied from hello_world Signed-off-by: Ilias Apalodimas --- Android.mk | 20 ++++++ CMakeLists.txt | 13 ++++ Makefile | 15 +++++ host/Makefile | 28 +++++++++ host/main.c | 102 ++++++++++++++++++++++++++++++ ta/Android.mk | 4 ++ ta/Makefile | 13 ++++ ta/include/logger_ta.h | 39 ++++++++++++ ta/logger_ta.c | 148 ++++++++++++++++++++++++++++++++++++++++++++ ta/sub.mk | 5 ++ ta/user_ta_header_defines.h | 58 +++++++++++++++++ 11 files changed, 445 insertions(+) create mode 100644 Android.mk create mode 100644 CMakeLists.txt create mode 100644 Makefile create mode 100644 host/Makefile create mode 100644 host/main.c create mode 100644 ta/Android.mk create mode 100644 ta/Makefile create mode 100644 ta/include/logger_ta.h create mode 100644 ta/logger_ta.c create mode 100644 ta/sub.mk create mode 100644 ta/user_ta_header_defines.h diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..b5749e6 --- /dev/null +++ b/Android.mk @@ -0,0 +1,20 @@ +###################### optee-logger ###################### +LOCAL_PATH := $(call my-dir) + +OPTEE_CLIENT_EXPORT = $(LOCAL_PATH)/../../optee_client/out/export + +include $(CLEAR_VARS) +LOCAL_CFLAGS += -DANDROID_BUILD +LOCAL_CFLAGS += -Wall + +LOCAL_SRC_FILES += host/main.c + +LOCAL_C_INCLUDES := $(LOCAL_PATH)/ta/include \ + $(OPTEE_CLIENT_EXPORT)/include \ + +LOCAL_SHARED_LIBRARIES := libteec +LOCAL_MODULE := optee_example_logger +LOCAL_MODULE_TAGS := optional +include $(BUILD_EXECUTABLE) + +include $(LOCAL_PATH)/ta/Android.mk diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a5c3935 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,13 @@ +project (logger C) + +set (SRC host/main.c) + +add_executable (${PROJECT_NAME} ${SRC}) + +target_include_directories(${PROJECT_NAME} + PRIVATE ta/include + PRIVATE include) + +target_link_libraries (${PROJECT_NAME} PRIVATE teec) + +install (TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b188683 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +export V?=0 + +# If _HOST or _TA specific compilers are not specified, then use CROSS_COMPILE +HOST_CROSS_COMPILE ?= $(CROSS_COMPILE) +TA_CROSS_COMPILE ?= $(CROSS_COMPILE) + +.PHONY: all +all: + $(MAKE) -C host CROSS_COMPILE="$(HOST_CROSS_COMPILE)" --no-builtin-variables + $(MAKE) -C ta CROSS_COMPILE="$(TA_CROSS_COMPILE)" LDFLAGS="" + +.PHONY: clean +clean: + $(MAKE) -C host clean + $(MAKE) -C ta clean diff --git a/host/Makefile b/host/Makefile new file mode 100644 index 0000000..c4c8239 --- /dev/null +++ b/host/Makefile @@ -0,0 +1,28 @@ +CC ?= $(CROSS_COMPILE)gcc +LD ?= $(CROSS_COMPILE)ld +AR ?= $(CROSS_COMPILE)ar +NM ?= $(CROSS_COMPILE)nm +OBJCOPY ?= $(CROSS_COMPILE)objcopy +OBJDUMP ?= $(CROSS_COMPILE)objdump +READELF ?= $(CROSS_COMPILE)readelf + +OBJS = main.o + +CFLAGS += -Wall -I../ta/include -I$(TEEC_EXPORT)/include -I./include +#Add/link other required libraries here +LDADD += -lteec -L$(TEEC_EXPORT)/lib + +BINARY = optee_example_hello_world + +.PHONY: all +all: $(BINARY) + +$(BINARY): $(OBJS) + $(CC) -o $@ $< $(LDADD) + +.PHONY: clean +clean: + rm -f $(OBJS) $(BINARY) + +%.o: %.c + $(CC) $(CFLAGS) -c $< -o $@ diff --git a/host/main.c b/host/main.c new file mode 100644 index 0000000..d433e4a --- /dev/null +++ b/host/main.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +/* OP-TEE TEE client API (built by optee_client) */ +#include + +/* To the the UUID (found the the TA's h-file(s)) */ +#include + +int main(int argc, char *argv[]) +{ + TEEC_Result res; + TEEC_Context ctx; + TEEC_Session sess; + TEEC_Operation op; + TEEC_UUID uuid = TA_LOGGER_UUID; + uint32_t err_origin; + + /* Initialize a context connecting us to the TEE */ + res = TEEC_InitializeContext(NULL, &ctx); + if (res != TEEC_SUCCESS) + errx(1, "TEEC_InitializeContext failed with code 0x%x", res); + + /* + * Open a session to the "hello world" TA, the TA will print "hello + * world!" in the log when the session is created. + */ + res = TEEC_OpenSession(&ctx, &sess, &uuid, + TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin); + if (res != TEEC_SUCCESS) + errx(1, "TEEC_Opensession failed with code 0x%x origin 0x%x", + res, err_origin); + + /* + * Execute a function in the TA by invoking it, in this case + * we're incrementing a number. + * + * The value of command ID part and how the parameters are + * interpreted is part of the interface provided by the TA. + */ + + /* Clear the TEEC_Operation struct */ + memset(&op, 0, sizeof(op)); + + /* + * Prepare the argument. Pass a value in the first parameter, + * the remaining three parameters are unused. + */ + op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, + TEEC_NONE, TEEC_NONE); + op.params[0].value.a = 42; + + printf("Invoking TA to increment %d\n", op.params[0].value.a); + res = TEEC_InvokeCommand(&sess, 1, &op, + &err_origin); + if (res != TEEC_SUCCESS) + errx(1, "TEEC_InvokeCommand failed with code 0x%x origin 0x%x", + res, err_origin); + printf("TA incremented value to %d\n", op.params[0].value.a); + + /* + * We're done with the TA, close the session and + * destroy the context. + * + * The TA will print "Goodbye!" in the log when the + * session is closed. + */ + + TEEC_CloseSession(&sess); + + TEEC_FinalizeContext(&ctx); + + return 0; +} diff --git a/ta/Android.mk b/ta/Android.mk new file mode 100644 index 0000000..a1ff14a --- /dev/null +++ b/ta/Android.mk @@ -0,0 +1,4 @@ +LOCAL_PATH := $(call my-dir) + +local_module := 8aaaf200-2450-11e4-abe2-0002a5d5c51b.ta +include $(BUILD_OPTEE_MK) diff --git a/ta/Makefile b/ta/Makefile new file mode 100644 index 0000000..3d2e6fc --- /dev/null +++ b/ta/Makefile @@ -0,0 +1,13 @@ +CFG_TEE_TA_LOG_LEVEL ?= 4 +CPPFLAGS += -DCFG_TEE_TA_LOG_LEVEL=$(CFG_TEE_TA_LOG_LEVEL) + +# The UUID for the Trusted Application +BINARY=8aaaf200-2450-11e4-abe2-0002a5d5c51b + +-include $(TA_DEV_KIT_DIR)/mk/ta_dev_kit.mk + +ifeq ($(wildcard $(TA_DEV_KIT_DIR)/mk/ta_dev_kit.mk), ) +clean: + @echo 'Note: $$(TA_DEV_KIT_DIR)/mk/ta_dev_kit.mk not found, cannot clean TA' + @echo 'Note: TA_DEV_KIT_DIR=$(TA_DEV_KIT_DIR)' +endif diff --git a/ta/include/logger_ta.h b/ta/include/logger_ta.h new file mode 100644 index 0000000..e7bff58 --- /dev/null +++ b/ta/include/logger_ta.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016-2017, Linaro Limited + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef TA_LOGGER_H +#define TA_LOGGER_H + + +/* + * This UUID is generated with uuidgen + * the ITU-T UUID generator at http://www.itu.int/ITU-T/asn1/uuid.html + */ +#define TA_LOGGER_UUID \ + { 0x8aaaf200, 0x2450, 0x11e4, \ + { 0xab, 0xe2, 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b} } + +#endif /*TA_LOGGER_H*/ diff --git a/ta/logger_ta.c b/ta/logger_ta.c new file mode 100644 index 0000000..6913f96 --- /dev/null +++ b/ta/logger_ta.c @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +#include + +/* + * Called when the instance of the TA is created. This is the first call in + * the TA. + */ +TEE_Result TA_CreateEntryPoint(void) +{ + DMSG("has been called"); + + return TEE_SUCCESS; +} + +/* + * Called when the instance of the TA is destroyed if the TA has not + * crashed or panicked. This is the last call in the TA. + */ +void TA_DestroyEntryPoint(void) +{ + DMSG("has been called"); +} + +/* + * Called when a new session is opened to the TA. *sess_ctx can be updated + * with a value to be able to identify this session in subsequent calls to the + * TA. In this function you will normally do the global initialization for the + * TA. + */ +TEE_Result TA_OpenSessionEntryPoint(uint32_t param_types, + TEE_Param __maybe_unused params[4], + void __maybe_unused **sess_ctx) +{ + uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_NONE, + TEE_PARAM_TYPE_NONE, + TEE_PARAM_TYPE_NONE, + TEE_PARAM_TYPE_NONE); + + DMSG("has been called"); + + if (param_types != exp_param_types) + return TEE_ERROR_BAD_PARAMETERS; + + /* Unused parameters */ + (void)¶ms; + (void)&sess_ctx; + + /* + * The DMSG() macro is non-standard, TEE Internal API doesn't + * specify any means to logging from a TA. + */ + IMSG("Entry log World!\n"); + + /* If return value != TEE_SUCCESS the session will not be created. */ + return TEE_SUCCESS; +} + +/* + * Called when a session is closed, sess_ctx hold the value that was + * assigned by TA_OpenSessionEntryPoint(). + */ +void TA_CloseSessionEntryPoint(void __maybe_unused *sess_ctx) +{ + (void)&sess_ctx; /* Unused parameter */ + IMSG("Goodbye!\n"); +} + +static TEE_Result inc_value(uint32_t param_types, + TEE_Param params[4]) +{ + uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INOUT, + TEE_PARAM_TYPE_NONE, + TEE_PARAM_TYPE_NONE, + TEE_PARAM_TYPE_NONE); + + DMSG("has been called"); + + if (param_types != exp_param_types) + return TEE_ERROR_BAD_PARAMETERS; + + IMSG("Got value: %u from NW", params[0].value.a); + params[0].value.a++; + IMSG("Increase value to: %u", params[0].value.a); + + return TEE_SUCCESS; +} + +static TEE_Result dec_value(uint32_t param_types, + TEE_Param params[4]) +{ + uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INOUT, + TEE_PARAM_TYPE_NONE, + TEE_PARAM_TYPE_NONE, + TEE_PARAM_TYPE_NONE); + + DMSG("has been called"); + + if (param_types != exp_param_types) + return TEE_ERROR_BAD_PARAMETERS; + + IMSG("Got value: %u from NW", params[0].value.a); + params[0].value.a--; + IMSG("Decrease value to: %u", params[0].value.a); + + return TEE_SUCCESS; +} +/* + * Called when a TA is invoked. sess_ctx hold that value that was + * assigned by TA_OpenSessionEntryPoint(). The rest of the paramters + * comes from normal world. + */ +TEE_Result TA_InvokeCommandEntryPoint(void __maybe_unused *sess_ctx, + uint32_t cmd_id, + uint32_t param_types, TEE_Param params[4]) +{ + (void)&sess_ctx; /* Unused parameter */ + + return TEE_ERROR_BAD_PARAMETERS; +} diff --git a/ta/sub.mk b/ta/sub.mk new file mode 100644 index 0000000..a178637 --- /dev/null +++ b/ta/sub.mk @@ -0,0 +1,5 @@ +global-incdirs-y += include +srcs-y += logger_ta.c + +# To remove a certain compiler flag, add a line like this +#cflags-template_ta.c-y += -Wno-strict-prototypes diff --git a/ta/user_ta_header_defines.h b/ta/user_ta_header_defines.h new file mode 100644 index 0000000..863dded --- /dev/null +++ b/ta/user_ta_header_defines.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2016-2017, Linaro Limited + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * The name of this file must not be modified + */ + +#ifndef USER_TA_HEADER_DEFINES_H +#define USER_TA_HEADER_DEFINES_H + +/* To get the TA UUID definition */ +#include + +#define TA_UUID TA_LOGGER_UUID + +/* + * TA properties: multi-instance TA, no specific attribute + * TA_FLAG_EXEC_DDR is meaningless but mandated. + */ +#define TA_FLAGS TA_FLAG_EXEC_DDR + +/* Provisioned stack size */ +#define TA_STACK_SIZE (2 * 1024) + +/* Provisioned heap size for TEE_Malloc() and friends */ +#define TA_DATA_SIZE (32 * 1024) + +/* Extra properties (give a version id and a string name) */ +#define TA_CURRENT_TA_EXT_PROPERTIES \ + { "gp.ta.description", USER_TA_PROP_TYPE_STRING, \ + "OP-TEE Secure logging" }, \ + { "gp.ta.version", USER_TA_PROP_TYPE_U32, &(const uint32_t){ 0x0010 } } + +#endif /* USER_TA_HEADER_DEFINES_H */ -- cgit v1.2.3