summaryrefslogtreecommitdiff
authorPengguang Zhu <pengguang.zhu@amlogic.com>2017-05-03 03:43:22 (GMT)
committer Pengguang Zhu <pengguang.zhu@amlogic.com>2017-05-10 03:30:58 (GMT)
commit6ebc31a619a0013f8b6c03076bbe77ef877cf5ab (patch)
tree01b44afceb28c8216fd673d474eaaca2cbf25bdf
parentd4e2a067357ca745d928a06f6ce70bce0c96aae2 (diff)
downloadtdk-6ebc31a619a0013f8b6c03076bbe77ef877cf5ab.zip
tdk-6ebc31a619a0013f8b6c03076bbe77ef877cf5ab.tar.gz
tdk-6ebc31a619a0013f8b6c03076bbe77ef877cf5ab.tar.bz2
update optee_test to 2.4.0
Change-Id: I7fa1e182a58a4a298adf2e172a215a35d6f8d5f4 commit: 170a1ee60a98b407790d97dc682568981d344ca3 revert: cc923db2ebb03e98cf703b91c3c6c8e074ecdf06
Diffstat
-rw-r--r--demos/optee_test/.conf.h107
-rw-r--r--demos/optee_test/.gitignore10
-rw-r--r--demos/optee_test/Android.mk73
-rw-r--r--demos/optee_test/Makefile134
-rw-r--r--demos/optee_test/README.md9
-rw-r--r--demos/optee_test/host/xtest/Makefile124
-rw-r--r--demos/optee_test/host/xtest/adbg/include/adbg.h56
-rw-r--r--demos/optee_test/host/xtest/adbg/src/adbg_case.c6
-rw-r--r--demos/optee_test/host/xtest/adbg/src/adbg_int.h5
-rw-r--r--demos/optee_test/host/xtest/adbg/src/adbg_run.c76
-rw-r--r--demos/optee_test/host/xtest/aes_perf.c25
-rw-r--r--demos/optee_test/host/xtest/benchmark_1000.c (renamed from demos/optee_test/host/xtest/xtest_benchmark_1000.c)6
-rw-r--r--demos/optee_test/host/xtest/benchmark_2000.c (renamed from demos/optee_test/host/xtest/xtest_benchmark_2000.c)8
-rw-r--r--demos/optee_test/host/xtest/crypto_common.h4
-rw-r--r--demos/optee_test/host/xtest/include/uapi/linux/ion.h238
-rw-r--r--demos/optee_test/host/xtest/rand_stream.c125
-rw-r--r--demos/optee_test/host/xtest/rand_stream.h28
-rw-r--r--demos/optee_test/host/xtest/regression_1000.c (renamed from demos/optee_test/host/xtest/xtest_1000.c)136
-rw-r--r--demos/optee_test/host/xtest/regression_2000.c908
-rw-r--r--demos/optee_test/host/xtest/regression_4000.c (renamed from demos/optee_test/host/xtest/xtest_4000.c)71
-rw-r--r--demos/optee_test/host/xtest/regression_4000_data.h (renamed from demos/optee_test/host/xtest/xtest_4000_data.h)0
-rw-r--r--demos/optee_test/host/xtest/regression_5000.c (renamed from demos/optee_test/host/xtest/xtest_5000.c)2
-rw-r--r--demos/optee_test/host/xtest/regression_6000.c (renamed from demos/optee_test/host/xtest/xtest_6000.c)174
-rw-r--r--demos/optee_test/host/xtest/regression_7000.c (renamed from demos/optee_test/host/xtest/xtest_7000.c)109
-rw-r--r--demos/optee_test/host/xtest/regression_8000.c (renamed from demos/optee_test/host/xtest/xtest_10000.c)32
-rw-r--r--demos/optee_test/host/xtest/regression_9000.c (renamed from demos/optee_test/host/xtest/xtest_20000.c)400
-rw-r--r--demos/optee_test/host/xtest/sdp_basic.c589
-rw-r--r--demos/optee_test/host/xtest/sdp_basic.h48
-rw-r--r--demos/optee_test/host/xtest/sha_perf.c43
-rw-r--r--demos/optee_test/host/xtest/sock_server.c407
-rw-r--r--demos/optee_test/host/xtest/sock_server.h51
-rw-r--r--demos/optee_test/host/xtest/xml/include/xml_client_api.h16
-rw-r--r--demos/optee_test/host/xtest/xtest_helpers.c73
-rw-r--r--demos/optee_test/host/xtest/xtest_helpers.h14
-rw-r--r--demos/optee_test/host/xtest/xtest_main.c206
-rw-r--r--demos/optee_test/host/xtest/xtest_test.c25
-rw-r--r--demos/optee_test/host/xtest/xtest_test.h108
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Arithmetical/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerErrorTo_Invoke/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerErrorTo_OpenSession/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerSuccessTo_OpenSession_Invoke/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_check_OpenSession_with_4_parameters/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_testingClientAPI/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Crypto/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_DS/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_ICA/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_ICA2/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_MultipleInstanceTA/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_SingleInstanceTA/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Time/code_files/sub.mk1
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/host/xtest/xtest_9000.c.patch142
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Adbg/xslstable/adbg_case_declare.xsl94
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Adbg/xslstable/adbg_entry_declare.xsl96
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/ClientAPI/xslstable/TEE.xsl4
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Crypto/xslstable/TEE_Crypto_API.xsl4
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/DataStorage/xslstable/TEE_DataStorage_API.xsl4
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Time_Arithmetical/xslstable/TEE_TimeArithm_API.xsl4
-rw-r--r--demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/TrustedCoreFw/xslstable/TEE_Internal_API.xsl4
-rw-r--r--demos/optee_test/scripts/common.mk9
-rw-r--r--demos/optee_test/ta/Makefile28
-rw-r--r--demos/optee_test/ta/aes_perf/Android.mk44
-rw-r--r--demos/optee_test/ta/concurrent/Android.mk44
-rw-r--r--demos/optee_test/ta/concurrent_large/Android.mk44
-rw-r--r--demos/optee_test/ta/create_fail_test/Android.mk44
-rw-r--r--demos/optee_test/ta/crypt/Android.mk44
-rw-r--r--demos/optee_test/ta/include/GP_defs.h4
-rw-r--r--demos/optee_test/ta/os_test/Android.mk44
-rw-r--r--demos/optee_test/ta/os_test/include/user_ta_header_defines.h2
-rw-r--r--demos/optee_test/ta/os_test/tb_modulus.c2
-rw-r--r--demos/optee_test/ta/rpc_test/Android.mk44
-rw-r--r--demos/optee_test/ta/rpc_test/include/ta_rpc.h10
-rw-r--r--demos/optee_test/ta/rpc_test/include/ta_rpc_test.h14
-rw-r--r--demos/optee_test/ta/rpc_test/ta_entry.c20
-rw-r--r--demos/optee_test/ta/rpc_test/ta_rpc.c89
-rw-r--r--demos/optee_test/ta/sdp_basic/Android.mk4
-rw-r--r--demos/optee_test/ta/sdp_basic/Makefile8
-rw-r--r--demos/optee_test/ta/sdp_basic/include/ta_sdp_basic.h46
-rw-r--r--demos/optee_test/ta/sdp_basic/include/user_ta_header_defines.h42
-rw-r--r--demos/optee_test/ta/sdp_basic/sub.mk2
-rw-r--r--demos/optee_test/ta/sdp_basic/ta_sdp_basic.c386
-rw-r--r--demos/optee_test/ta/sha_perf/Android.mk44
-rw-r--r--demos/optee_test/ta/sims/Android.mk44
-rw-r--r--demos/optee_test/ta/socket/Android.mk4
-rw-r--r--demos/optee_test/ta/socket/Makefile2
-rw-r--r--demos/optee_test/ta/socket/include/ta_socket.h99
-rw-r--r--demos/optee_test/ta/socket/include/user_ta_header_defines.h40
-rw-r--r--demos/optee_test/ta/socket/sub.mk2
-rw-r--r--demos/optee_test/ta/socket/ta_entry.c285
-rw-r--r--demos/optee_test/ta/storage/Android.mk44
-rw-r--r--demos/optee_test/ta/storage2/Android.mk44
-rw-r--r--demos/optee_test/ta/storage_benchmark/Android.mk44
92 files changed, 4603 insertions, 1835 deletions
diff --git a/demos/optee_test/.conf.h b/demos/optee_test/.conf.h
deleted file mode 100644
index 3962bee..0000000
--- a/demos/optee_test/.conf.h
+++ b/dev/null
@@ -1,107 +0,0 @@
-#ifndef _out_arm_plat_meson_include_generated_conf_h_
-#define _out_arm_plat_meson_include_generated_conf_h_
-#define CFG_ARM32_core 1
-#define CFG_ARM32_ta_arm32 1
-/* CFG_BOOT_SECONDARY_REQUEST is not set */
-#define CFG_CACHE_API 1
-#define CFG_CORE_HEAP_SIZE 65536
-/* CFG_CORE_SANITIZE_KADDRESS is not set */
-/* CFG_CORE_SANITIZE_UNDEFINED is not set */
-#define CFG_CORE_TZSRAM_EMUL_SIZE 307200
-#define CFG_CRYPTO 1
-#define CFG_CRYPTO_AES 1
-#define CFG_CRYPTO_AES_AML 1
-#define CFG_CRYPTO_CBC 1
-#define CFG_CRYPTO_CBC_MAC 1
-#define CFG_CRYPTO_CCM 1
-#define CFG_CRYPTO_CMAC 1
-#define CFG_CRYPTO_CONCAT_KDF 1
-#define CFG_CRYPTO_CTR 1
-#define CFG_CRYPTO_CTS 1
-#define CFG_CRYPTO_DES 1
-#define CFG_CRYPTO_DES_AML 1
-#define CFG_CRYPTO_DH 1
-#define CFG_CRYPTO_DSA 1
-#define CFG_CRYPTO_ECB 1
-#define CFG_CRYPTO_ECC 1
-#define CFG_CRYPTO_GCM 1
-#define CFG_CRYPTO_GCM_AML 1
-#define CFG_CRYPTO_HKDF 1
-#define CFG_CRYPTO_HMAC 1
-/* CFG_CRYPTO_HMAC_AML is not set */
-/* CFG_CRYPTO_INTERNAL_TEST is not set */
-#define CFG_CRYPTO_MD5 1
-#define CFG_CRYPTO_PBKDF2 1
-#define CFG_CRYPTO_RSA 1
-#define CFG_CRYPTO_SHA1 1
-/* CFG_CRYPTO_SHA1_AML is not set */
-#define CFG_CRYPTO_SHA224 1
-/* CFG_CRYPTO_SHA224_AML is not set */
-#define CFG_CRYPTO_SHA256 1
-/* CFG_CRYPTO_SHA256_AML is not set */
-#define CFG_CRYPTO_SHA384 1
-#define CFG_CRYPTO_SHA512 1
-#define CFG_CRYPTO_SIZE_OPTIMIZATION 1
-#define CFG_CRYPTO_XTS 1
-/* CFG_DT is not set */
-#define CFG_DTB_MAX_SIZE 0x10000
-#define CFG_EFUSE 1
-#define CFG_ENC_FS_ALG_AES_CTR_AND_HMAC 1
-#define CFG_GENERIC_BOOT 1
-#define CFG_KERN_LINKER_ARCH arm
-#define CFG_KERN_LINKER_FORMAT elf32-littlearm
-#define CFG_LIBUTILS_WITH_ISOC 1
-#define CFG_LTC_OPTEE_THREAD 1
-#define CFG_MESON_UART 1
-#define CFG_MMU_V7_TTB 1
-#define CFG_MSG_LONG_PREFIX_THRESHOLD 3
-#define CFG_NUM_THREADS 4
-#define CFG_OPTEE_REVISION_MAJOR 2
-#define CFG_OPTEE_REVISION_MINOR 3
-#define CFG_OTP_SUPPORT 1
-/* CFG_PAGED_USER_TA is not set */
-#define CFG_PM_STUBS 1
-#define CFG_REE_FS 1
-/* CFG_REE_FS_BLOCK_CACHE is not set */
-#define CFG_RPMB_FS 1
-#define CFG_RPMB_FS_DEV_ID 0
-#define CFG_SECURE_STORAGE 1
-/* CFG_SECURE_TIME_SOURCE_REE is not set */
-#define CFG_SECURE_TIME_SOURCE_TEE 1
-#define CFG_SMALL_PAGE_USER_TA 1
-/* CFG_SQL_FS is not set */
-#define CFG_TA_FLOAT_SUPPORT 1
-#define CFG_TEE_API_VERSION GPD-1.1-dev
-/* CFG_TEE_CORE_DEBUG is not set */
-#define CFG_TEE_CORE_EMBED_INTERNAL_TESTS 1
-#define CFG_TEE_CORE_LOG_LEVEL 1
-/* CFG_TEE_CORE_MALLOC_DEBUG is not set */
-#define CFG_TEE_CORE_TA_TRACE 1
-#define CFG_TEE_CORE_USER_MEM_DEBUG 1
-#define CFG_TEE_FW_IMPL_VERSION FW_IMPL_UNDEF
-#define CFG_TEE_FW_MANUFACTURER FW_MAN_UNDEF
-#define CFG_TEE_IMPL_DESCR OPTEE
-#define CFG_TEE_MANUFACTURER LINARO
-#define CFG_TEE_PANIC_DEBUG 1
-#define CFG_TEE_TA_LOG_LEVEL 1
-/* CFG_TEE_TA_MALLOC_DEBUG is not set */
-#define CFG_WITH_ARM_TRUSTED_FW 1
-#define CFG_WITH_DEBUG 1
-/* CFG_WITH_PAGER is not set */
-#define CFG_WITH_SOFTWARE_PRNG 1
-#define CFG_WITH_STACK_CANARIES 1
-#define CFG_WITH_STATS 1
-#define CFG_WITH_USER_TA 1
-#define CFG_WITH_VFP 1
-#define PLATFORM_FLAVOR gxbb
-#define PLATFORM_FLAVOR_gxbb 1
-#define PLATFORM_meson 1
-#define _CFG_CRYPTO_WITH_ACIPHER 1
-#define _CFG_CRYPTO_WITH_ASN1 1
-#define _CFG_CRYPTO_WITH_AUTHENC 1
-#define _CFG_CRYPTO_WITH_CBC 1
-#define _CFG_CRYPTO_WITH_CIPHER 1
-#define _CFG_CRYPTO_WITH_FORTUNA_PRNG 1
-#define _CFG_CRYPTO_WITH_HASH 1
-#define _CFG_CRYPTO_WITH_MAC 1
-#endif
diff --git a/demos/optee_test/.gitignore b/demos/optee_test/.gitignore
index c7bd56b..6c107c1 100644
--- a/demos/optee_test/.gitignore
+++ b/demos/optee_test/.gitignore
@@ -6,11 +6,11 @@ GTAGS
out/*
ta/GP_*
host/xtest/global_platform/
-host/xtest/xtest_7000_gp.c
-host/xtest/xtest_7500.c
-host/xtest/xtest_8000.c
-host/xtest/xtest_8500.c
-host/xtest/xtest_9000.c
+host/xtest/gp_7000.c
+host/xtest/gp_7500.c
+host/xtest/gp_8000.c
+host/xtest/gp_8500.c
+host/xtest/gp_9000.c
host/xtest/adbg_case_declare.h
host/xtest/adbg_entry_declare.h
package/testsuite/global_platform/api_1.0/TEE*
diff --git a/demos/optee_test/Android.mk b/demos/optee_test/Android.mk
index f0ee2f8..f89d5e3 100644
--- a/demos/optee_test/Android.mk
+++ b/demos/optee_test/Android.mk
@@ -1,42 +1,59 @@
LOCAL_PATH := $(call my-dir)
-TEE_XTEST_PATH := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/gen/EXECUTABLES/tee_xtest_intermediates
-$(info $(shell if [ ! -d $(TEE_XTEST_PATH) ]; then mkdir -p $(TEE_XTEST_PATH); fi))
+## include variants like TA_DEV_KIT_DIR
+## and target of BUILD_OPTEE_OS
+INCLUDE_FOR_BUILD_TA := false
+include $(BUILD_OPTEE_MK)
+INCLUDE_FOR_BUILD_TA :=
-CFG_TEEC_PUBLIC_PATH = $(LOCAL_PATH)/../../ca_export_$(TARGET_ARCH)
+VERSION = $(shell git describe --always --dirty=-dev 2>/dev/null || echo Unknown)
-CFG_TA_DEV_KIT_DIR = $(LOCAL_PATH)/../../ta_export
+# TA_DEV_KIT_DIR must be set to non-empty value to
+# avoid the Android build scripts complaining about
+# includes pointing outside the Android source tree.
+# This var is expected to be set when OPTEE OS built.
+# We set the default value to an invalid path.
+TA_DEV_KIT_DIR ?= ../invalid_include_path
-include $(CFG_TA_DEV_KIT_DIR)/host_include/conf.mk
+-include $(TA_DEV_KIT_DIR)/host_include/conf.mk
include $(CLEAR_VARS)
-LOCAL_MODULE := tee_xtest
+LOCAL_MODULE := xtest
LOCAL_SHARED_LIBRARIES := libteec
-srcs := xtest_1000.c \
- xtest_4000.c \
- xtest_5000.c \
- xtest_6000.c \
- xtest_7000.c \
- xtest_10000.c \
- xtest_20000.c \
- xtest_benchmark_1000.c \
- xtest_benchmark_2000.c \
- xtest_helpers.c \
- xtest_main.c \
- xtest_test.c \
- adbg/src/adbg_case.c \
+srcs := regression_1000.c
+
+ifeq ($(CFG_GP_SOCKETS),y)
+srcs += regression_2000.c \
+ sock_server.c \
+ rand_stream.c
+endif
+
+srcs += adbg/src/adbg_case.c \
adbg/src/adbg_enum.c \
adbg/src/adbg_expect.c \
adbg/src/adbg_log.c \
adbg/src/adbg_run.c \
adbg/src/security_utils_hex.c \
aes_perf.c \
- sha_perf.c
+ benchmark_1000.c \
+ benchmark_2000.c \
+ regression_4000.c \
+ regression_5000.c \
+ regression_6000.c \
+ regression_7000.c \
+ regression_8000.c \
+ regression_9000.c \
+ sha_perf.c \
+ xtest_helpers.c \
+ xtest_main.c \
+ xtest_test.c
+
+ifeq ($(CFG_SECURE_DATA_PATH),y)
+srcs += sdp_basic.c
+endif
LOCAL_SRC_FILES := $(patsubst %,host/xtest/%,$(srcs))
-LOCAL_C_INCLUDES += $(CFG_TEEC_PUBLIC_PATH)/include \
- $(CFG_TA_DEV_KIT_DIR)/host_include
LOCAL_C_INCLUDES += $(LOCAL_PATH)/host/xtest \
$(LOCAL_PATH)/host/xtest/adbg/include\
@@ -53,14 +70,20 @@ LOCAL_C_INCLUDES += $(LOCAL_PATH)/host/xtest \
$(LOCAL_PATH)/ta/storage/include \
$(LOCAL_PATH)/ta/storage_benchmark/include \
$(LOCAL_PATH)/ta/sha_perf/include \
- $(LOCAL_PATH)/ta/aes_perf/include
+ $(LOCAL_PATH)/ta/aes_perf/include \
+ $(LOCAL_PATH)/ta/socket/include \
+ $(LOCAL_PATH)/ta/sdp_basic/include
# Include configuration file generated by OP-TEE OS (CFG_* macros)
-LOCAL_CFLAGS += -include .conf.h
-LOCAL_CFLAGS += -DTA_DIR=\"/system/lib/teetz\"
+LOCAL_CFLAGS += -include conf.h
LOCAL_CFLAGS += -pthread
LOCAL_CFLAGS += -g3
+## target BUILD_OPTEE_OS is defined in the common ta build
+## mk file included before, and this BUILD_OPTEE_OS will
+## help to generate the header files under $(TA_DEV_KIT_DIR)/host_include
+LOCAL_ADDITIONAL_DEPENDENCIES := BUILD_OPTEE_OS
+
include $(BUILD_EXECUTABLE)
include $(LOCAL_PATH)/ta/Android.mk
diff --git a/demos/optee_test/Makefile b/demos/optee_test/Makefile
index 4d82b46..ae58c4f 100644
--- a/demos/optee_test/Makefile
+++ b/demos/optee_test/Makefile
@@ -1,17 +1,11 @@
-export V?=0
-export CROSS_COMPILE_HOST=aarch64-linux-gnu-
-export CROSS_COMPILE_HOST32=arm-linux-gnueabihf-
-export CROSS_COMPILE_TA=arm-linux-gnueabihf-
-
-export TDK_DIR=$(CURDIR)/../..
-export TA_DEV_KIT_DIR=$(CURDIR)/../../ta_export
-
-ifneq ($O,)
- out-dir := $O
+ifeq ($O,)
+out-dir := $(CURDIR)/out
else
- # If no build folder has been specified, then create all build files in
- # the current directory under a folder named out.
- out-dir := $(CURDIR)/out
+include scripts/common.mk
+out-dir := $(call strip-trailing-slashes-and-dots,$(O))
+ifeq ($(out-dir),)
+$(error invalid output directory (O=$(O)))
+endif
endif
-include $(TA_DEV_KIT_DIR)/host_include/conf.mk
@@ -23,9 +17,12 @@ else
q :=
echo := @:
endif
+# export 'q', used by sub-makefiles.
+export q
-CA_MODE64 = 64
-CA_MODE32 = 32
+# If _HOST or _TA specific compilers are not specified, then use CROSS_COMPILE
+CROSS_COMPILE_HOST ?= $(CROSS_COMPILE)
+CROSS_COMPILE_TA ?= $(CROSS_COMPILE)
.PHONY: all
ifneq ($(wildcard $(TA_DEV_KIT_DIR)/host_include/conf.mk),)
@@ -36,26 +33,23 @@ all:
endif
.PHONY: xtest
-xtest: tee_xtest64 tee_xtest32
-tee_xtest64:
- $(q)$(MAKE) -C host/xtest CROSS_COMPILE=$(CROSS_COMPILE_HOST) q=$(q) O=$(out-dir)/xtest MODE=$(CA_MODE64)
- $(q)$(MAKE) -C host/xtest O=$(out-dir)/xtest clean-objs q=$(q)
-tee_xtest32:
- $(q)$(MAKE) -C host/xtest CROSS_COMPILE=$(CROSS_COMPILE_HOST32) q=$(q) O=$(out-dir)/xtest MODE=$(CA_MODE32)
- $(q)$(MAKE) -C host/xtest O=$(out-dir)/xtest clean-objs q=$(q)
+xtest:
+ $(q)$(MAKE) -C host/xtest CROSS_COMPILE="$(CROSS_COMPILE_HOST)" \
+ --no-builtin-variables \
+ O=$(out-dir) \
+ $@
.PHONY: ta
ta:
$(q)$(MAKE) -C ta CROSS_COMPILE="$(CROSS_COMPILE_TA)" \
- q=$(q) \
- O=$(out-dir)/ta \
+ O=$(out-dir) \
$@
.PHONY: clean
ifneq ($(wildcard $(TA_DEV_KIT_DIR)/host_include/conf.mk),)
clean:
- $(q)$(MAKE) -C host/xtest O=$(out-dir)/xtest q=$(q) $@
- $(q)$(MAKE) -C ta O=$(out-dir)/ta q=$(q) $@
+ $(q)$(MAKE) -C host/xtest O=$(out-dir) $@
+ $(q)$(MAKE) -C ta O=$(out-dir) $@
else
clean:
$(q)echo "TA_DEV_KIT_DIR is not correctly defined"
@@ -137,19 +131,17 @@ patch-generate-host: patch-package
$(q) mkdir -p ${GP_XTEST_IN_DIR} ${GP_XTEST_IN_DIR}
$(q)find ${CFG_GP_PACKAGE_PATH}/packages -type f -name "*.xml" -exec cp -p {} ${GP_XTEST_IN_DIR} \;
$(q)find ${CFG_GP_XSL_PACKAGE_PATH}/packages -type f -name "*.xsl" -exec cp -p {} ${GP_XTEST_IN_DIR} \;
- $(call patch-xalan,TEE.xml,adbg_case_declare.xsl,adbg_case_declare.h)
- $(call patch-xalan,TEE.xml,adbg_entry_declare.xsl,adbg_entry_declare.h)
- $(call patch-xalan,TEE.xml,TEE.xsl,xtest_7000_gp.c)
- $(call patch-xalan,TEE_DataStorage_API.xml,TEE_DataStorage_API.xsl,xtest_7500.c)
- $(call patch-xalan,TEE_Internal_API.xml,TEE_Internal_API.xsl,xtest_8000.c)
- $(call patch-xalan,TEE_TimeArithm_API.xml,TEE_TimeArithm_API.xsl,xtest_8500.c)
- $(call patch-xalan,TEE_Crypto_API.xml,TEE_Crypto_API.xsl,xtest_9000.c)
+ $(call patch-xalan,TEE.xml,TEE.xsl,gp_7000.c)
+ $(call patch-xalan,TEE_DataStorage_API.xml,TEE_DataStorage_API.xsl,gp_7500.c)
+ $(call patch-xalan,TEE_Internal_API.xml,TEE_Internal_API.xsl,gp_8000.c)
+ $(call patch-xalan,TEE_TimeArithm_API.xml,TEE_TimeArithm_API.xsl,gp_8500.c)
+ $(call patch-xalan,TEE_Crypto_API.xml,TEE_Crypto_API.xsl,gp_9000.c)
@echo "INFO: Patch host tests"
# $(q)sed -i '752 c\ xtest_tee_deinit();\n' ${GP_XTEST_OUT_DIR}/xtest_7000.c
# $(q)sed -i '1076 c\ xtest_tee_deinit();\n' ${GP_XTEST_OUT_DIR}/xtest_8000.c
# $(q)sed -i '2549 c\ xtest_tee_deinit();\n' ${GP_XTEST_OUT_DIR}/xtest_8500.c
# $(q)sed -i '246 c\ xtest_tee_deinit();\n' ${GP_XTEST_OUT_DIR}/xtest_9000.c
- $(call patch-file,host/xtest/xtest_9000.c,${CFG_GP_XSL_PACKAGE_PATH}/host/xtest/xtest_9000.c.patch)
+ $(call patch-file,host/xtest/gp_9000.c,${CFG_GP_XSL_PACKAGE_PATH}/host/xtest/gp_9000.c.patch)
.PHONY: patch-generate-ta
patch-generate-ta: patch-package
@@ -207,66 +199,20 @@ patch-package:
$(call patch-file,${CFG_GP_PACKAGE_PATH}/TTAs/TTA_Time/TTA_Time/code_files/TTA_Time.c,${CFG_GP_XSL_PACKAGE_PATH}/TTAs/TTA_Time/code_patches/v1_1_0_4-2014_11_07/TTA_Time.c.patch)
define patch-filter-one
- $(q)sed -i 's|^ADBG_SUITE_ENTRY(XTEST_TEE_'${1}', NULL)|/\*ADBG_SUITE_ENTRY(XTEST_TEE_'${1}', NULL)\*/|g' ${GP_XTEST_OUT_DIR}/xtest_main.c
- $(q)sed -i 's| ADBG_SUITE_ENTRY(XTEST_TEE_'${1}', NULL)\\| /\*ADBG_SUITE_ENTRY(XTEST_TEE_'${1}', NULL)\*/\\|g' ${GP_XTEST_OUT_DIR}/adbg_entry_declare.h
+ $(q)sed -i 's|^\(ADBG_CASE_DEFINE(gp,\) $1,\(.*\)$$|/\*\1 $1,\2\*/|g' ${GP_XTEST_OUT_DIR}/$2
+
endef
.PHONY: patch-filter
patch-filter:
- @echo "INFO: Filter some tests"
- $(call patch-filter-one,7038)
- $(call patch-filter-one,7522)
- $(call patch-filter-one,7538)
- $(call patch-filter-one,7540)
- $(call patch-filter-one,7546)
- $(call patch-filter-one,7557)
- $(call patch-filter-one,7522)
- $(call patch-filter-one,7538)
- $(call patch-filter-one,7540)
- $(call patch-filter-one,7546)
- $(call patch-filter-one,7557)
- $(call patch-filter-one,7559)
- $(call patch-filter-one,7577)
- $(call patch-filter-one,7641)
- $(call patch-filter-one,7642)
- $(call patch-filter-one,7643)
- $(call patch-filter-one,7644)
- $(call patch-filter-one,7686)
- $(call patch-filter-one,8025)
- $(call patch-filter-one,8058)
- $(call patch-filter-one,8059)
- $(call patch-filter-one,8030)
- $(call patch-filter-one,8066)
- $(call patch-filter-one,8614)
- $(call patch-filter-one,8643)
- $(call patch-filter-one,8644)
- $(call patch-filter-one,8673)
- $(call patch-filter-one,8674)
- $(call patch-filter-one,9001)
- $(call patch-filter-one,9072)
- $(call patch-filter-one,9073)
- $(call patch-filter-one,9075)
- $(call patch-filter-one,9079)
- $(call patch-filter-one,9080)
- $(call patch-filter-one,9082)
- $(call patch-filter-one,9085)
- $(call patch-filter-one,9086)
- $(call patch-filter-one,9088)
- $(call patch-filter-one,9090)
- $(call patch-filter-one,9091)
- $(call patch-filter-one,9093)
- $(call patch-filter-one,9095)
- $(call patch-filter-one,9096)
- $(call patch-filter-one,9098)
- $(call patch-filter-one,9099)
- $(call patch-filter-one,9109)
- $(call patch-filter-one,9110)
- $(call patch-filter-one,9160)
- $(call patch-filter-one,9174)
- $(call patch-filter-one,9195)
- $(call patch-filter-one,9196)
- $(call patch-filter-one,9204)
- $(call patch-filter-one,9239)
+ @echo "INFO: Filter out some tests"
+ @# 7001-7010, 7013, 7016-7019 are in regression_7000.c already
+ $(foreach n,7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7013 7016 7017 7018 7019,$(call patch-filter-one,$(n),gp_7000.c))
+ $(call patch-filter-one,7038,gp_7000.c)
+ $(foreach n,7522 7538 7540 7546 7557 7559 7577 7641 7642 7643 7644 7686,$(call patch-filter-one,$(n),gp_7500.c))
+ $(foreach n,8025 8030 8058 8059 8066,$(call patch-filter-one,$(n),gp_8000.c))
+ $(foreach n,8614 8643 8644 8673 8674,$(call patch-filter-one,$(n),gp_8500.c))
+ $(foreach n,9001 9072 9073 9075 9079 9080 9082 9085 9086 9088 9090 9091 9093 9095 9096 9098 9099 9109 9110 9160 9174 9195 9196 9204 9239,$(call patch-filter-one,$(n),gp_9000.c))
.PHONY: patch
patch: patch-openssl patch-generate-host patch-generate-ta
@@ -279,9 +225,9 @@ patch:
endif
install:
- $(echo) ' INSTALL ${DESTDIR}/lib/teetz'
- $(q)mkdir -p ${DESTDIR}/lib/teetz
- $(q)find $(out-dir) -name \*.ta -exec cp -a {} ${DESTDIR}/lib/teetz \;
+ $(echo) ' INSTALL ${DESTDIR}/lib/optee_armtz'
+ $(q)mkdir -p ${DESTDIR}/lib/optee_armtz
+ $(q)find $(out-dir) -name \*.ta -exec cp -a {} ${DESTDIR}/lib/optee_armtz \;
$(echo) ' INSTALL ${DESTDIR}/bin'
$(q)mkdir -p ${DESTDIR}/bin
- $(q)cp -a $(out-dir)/xtest/tee_xtest* ${DESTDIR}/bin
+ $(q)cp -a $(out-dir)/xtest/xtest ${DESTDIR}/bin
diff --git a/demos/optee_test/README.md b/demos/optee_test/README.md
index b445dcf..4811cf1 100644
--- a/demos/optee_test/README.md
+++ b/demos/optee_test/README.md
@@ -59,31 +59,29 @@ Then the tests must be compiled with `CFG_GP_PACKAGE_PATH=<path>`.
# all xtest
boot and execute on your target
- $ modprobe optee_armtz
+ $ ifconfig lo 127.0.0.1
$ tee-supplicant &
$ xtest
# single xtest
boot and execute on your target
- $ modprobe optee_armtz
+ $ ifconfig lo 127.0.0.1
$ tee-supplicant &
$ xtest <testnumber> (i.e.: xtest 1001)
# family xtest (i.e.: Family 1000)
boot and execute on your target
- $ modprobe optee_armtz
+ $ ifconfig lo 127.0.0.1
$ tee-supplicant &
$ xtest _<family> (i.e.: xtest _1)
# running all benchmarks (secured storage, aes/sha)
boot and execute on your target
- $ modprobe optee_armtz
$ tee-supplicant &
$ xtest -t benchmark
# running single benchmark
boot and execute on your target
- $ modprobe optee_armtz
$ tee-supplicant &
$ xtest -t benchmark <benchmark_number> (i.e. xtest 2001)
@@ -94,7 +92,6 @@ params.
# running sha-perf with default params
boot and execute on your target
- $ modprobe optee_armtz
$ tee-supplicant &
$ xtest --sha-perf
diff --git a/demos/optee_test/host/xtest/Makefile b/demos/optee_test/host/xtest/Makefile
index 789f5ca..1c5f6d6 100644
--- a/demos/optee_test/host/xtest/Makefile
+++ b/demos/optee_test/host/xtest/Makefile
@@ -1,8 +1,11 @@
# Normally this makefile shouldn't be called directly and we expect the output
# path to be on a certain location to fit together with the other OP-TEE
# gits and helper scripts.
-ifeq ($O,)
-$(error output path should be specified when calling this makefile)
+
+include ../../scripts/common.mk
+out-dir := $(call strip-trailing-slashes-and-dots,$(O))
+ifeq ($(out-dir),)
+$(error invalid output directory (O=$(O)))
endif
include $(TA_DEV_KIT_DIR)/host_include/conf.mk
@@ -10,58 +13,60 @@ include $(TA_DEV_KIT_DIR)/host_include/conf.mk
# By default we expect optee_client exported folder to be on a certain relative
# path, but if the client specifies the OPTEE_CLIENT_EXPORT then that path will
# be used instead.
-ifeq ($(MODE), 64)
-OPTEE_CLIENT_EXPORT=$(TDK_DIR)/ca_export_arm64
-endif
-
-ifeq ($(MODE), 32)
-OPTEE_CLIENT_EXPORT=$(TDK_DIR)/ca_export_arm
-endif
-
-CC := $(CROSS_COMPILE)gcc
-CPP := $(CROSS_COMPILE)cpp
-LD := $(CROSS_COMPILE)ld
-AR := $(CROSS_COMPILE)ar
-NM := $(CROSS_COMPILE)nm
-OBJCOPY := $(CROSS_COMPILE)objcopy
-OBJDUMP := $(CROSS_COMPILE)objdump
-READELF := $(CROSS_COMPILE)readelf
-
-ifdef CFG_GP_PACKAGE_PATH
-GP := _gp
+OPTEE_CLIENT_EXPORT ?= ../../../optee_client/out/export
+
+CC ?= $(CROSS_COMPILE)gcc
+CPP ?= $(CROSS_COMPILE)cpp
+LD ?= $(CROSS_COMPILE)ld
+AR ?= $(CROSS_COMPILE)ar
+NM ?= $(CROSS_COMPILE)nm
+OBJCOPY ?= $(CROSS_COMPILE)objcopy
+OBJDUMP ?= $(CROSS_COMPILE)objdump
+READELF ?= $(CROSS_COMPILE)readelf
+
+srcs := regression_1000.c
+
+ifeq ($(CFG_GP_SOCKETS),y)
+srcs += regression_2000.c \
+ sock_server.c \
+ rand_stream.c
endif
-srcs := xtest_1000.c \
- xtest_4000.c \
- xtest_5000.c \
- xtest_6000.c \
- xtest_7000$(GP).c \
- xtest_10000.c \
- xtest_20000.c \
- xtest_benchmark_1000.c \
- xtest_benchmark_2000.c \
- xtest_helpers.c \
- xtest_main.c \
- xtest_test.c \
- sha_perf.c \
- aes_perf.c \
- adbg/src/adbg_case.c \
+srcs += adbg/src/adbg_case.c \
adbg/src/adbg_enum.c \
adbg/src/adbg_expect.c \
adbg/src/adbg_log.c \
adbg/src/adbg_run.c \
- adbg/src/security_utils_hex.c
+ adbg/src/security_utils_hex.c \
+ aes_perf.c \
+ benchmark_1000.c \
+ benchmark_2000.c \
+ regression_4000.c \
+ regression_5000.c \
+ regression_6000.c \
+ regression_7000.c \
+ regression_8000.c \
+ regression_9000.c \
+ sha_perf.c \
+ xtest_helpers.c \
+ xtest_main.c \
+ xtest_test.c
+
+ifeq ($(CFG_SECURE_DATA_PATH),y)
+srcs += sdp_basic.c
+endif
ifdef CFG_GP_PACKAGE_PATH
CFLAGS += -DWITH_GP_TESTS
-srcs += xtest_7500.c \
- xtest_8000.c \
- xtest_8500.c \
- xtest_9000.c
+srcs += gp_7000.c \
+ gp_7500.c \
+ gp_8000.c \
+ gp_8500.c \
+ gp_9000.c
endif
-objs := $(patsubst %.c,$(O)/%.o, $(srcs))
+objs := $(patsubst %.c,$(out-dir)/xtest/%.o, $(srcs))
CFLAGS += -I./
CFLAGS += -I./adbg/include
@@ -82,6 +87,9 @@ CFLAGS += -I../../ta/concurrent/include
CFLAGS += -I../../ta/concurrent_large/include
CFLAGS += -I../../ta/sha_perf/include
CFLAGS += -I../../ta/aes_perf/include
+CFLAGS += -I../../ta/socket/include
+CFLAGS += -I../../ta/sdp_basic/include
+
ifdef CFG_GP_PACKAGE_PATH
CFLAGS += -I../../ta/GP_TTA_Arithmetical
CFLAGS += -I../../ta/GP_TTA_Crypto
@@ -117,7 +125,7 @@ endif
endif
# Include configuration file generated by OP-TEE OS (CFG_* macros)
-CFLAGS += -include ../../.conf.h
+CFLAGS += -include conf.h
ifndef CFG_GP_PACKAGE_PATH
CFLAGS += -Wall -Wcast-align -Werror \
@@ -134,26 +142,30 @@ endif
CFLAGS += -g3
LDFLAGS += -L$(OPTEE_CLIENT_EXPORT)/lib -lteec
-LDFLAGS += -lpthread -lm -lrt
+LDFLAGS += -lpthread -lm
.PHONY: all
-all: tee_xtest_$(MODE)
+all: xtest
-tee_xtest_$(MODE): $(objs)
- @echo " LD $(O)/$@"
- $(q)@$(CC) -o $(O)/$@ $+ $(LDFLAGS)
+xtest: $(objs)
+ @echo " LD $(out-dir)/xtest/$@"
+ $(q)@$(CC) -o $(out-dir)/xtest/$@ $+ $(LDFLAGS)
-$(O)/%.o: $(CURDIR)/%.c
- $(q)mkdir -p $(O)/adbg/src
+$(out-dir)/xtest/%.o: $(CURDIR)/%.c
+ $(q)mkdir -p $(out-dir)/xtest/adbg/src
@echo ' CC $<'
$(q)$(CC) $(CFLAGS) -c $< -o $@
-.PHONY: clean clean-objs
-clean-objs:
- $(q)$(foreach obj,$(objs), rm -f $(obj))
+RMDIR := rmdir --ignore-fail-on-non-empty
+define rm-build-dirs
+ $(q)for d in $1; do $(RMDIR) $(out-dir)/xtest/$$d 2> /dev/null; true; done
+ $(q)$(RMDIR) $(out-dir)/xtest 2> /dev/null; true
+ $(q)$(RMDIR) $(out-dir) 2> /dev/null; true
+endef
+.PHONY: clean
clean:
- @echo ' CLEAN $(O)'
- $(q)rm -f $(O)/tee_xtest_64
- $(q)rm -f $(O)/tee_xtest_32
+ @echo ' CLEAN $(out-dir)'
+ $(q)rm -f $(out-dir)/xtest/xtest
$(q)$(foreach obj,$(objs), rm -f $(obj))
+ $(call rm-build-dirs,adbg/src adbg)
diff --git a/demos/optee_test/host/xtest/adbg/include/adbg.h b/demos/optee_test/host/xtest/adbg/include/adbg.h
index c606999..0a2401a 100644
--- a/demos/optee_test/host/xtest/adbg/include/adbg.h
+++ b/demos/optee_test/host/xtest/adbg/include/adbg.h
@@ -13,10 +13,11 @@
#ifndef ADBG_H
#define ADBG_H
-#include <stddef.h>
#include <stdarg.h>
#include <stdbool.h>
+#include <stddef.h>
#include <stdint.h>
+#include <sys/queue.h>
#define ADBG_STRING_LENGTH_MAX (1024)
@@ -36,31 +37,36 @@ ADBG_CASE_DEFINE(TEST_1001, TEST_Test_1001,
);
#endif
-#define ADBG_CASE_DEFINE(TestID, Run, Title) \
- const ADBG_Case_Definition_t TestID = {#TestID, Title, Run, }
-
-#define ADBG_CASE_DECLARE(name) \
- extern const ADBG_Case_Definition_t name
-
-
typedef struct ADBG_Case ADBG_Case_t;
-
-typedef struct {
+typedef struct adbg_case_def {
const char *TestID_p;
const char *Title_p;
void (*Run_fp)(ADBG_Case_t *ADBG_Case_pp);
+ TAILQ_ENTRY(adbg_case_def) link;
} ADBG_Case_Definition_t;
-typedef struct {
- const ADBG_Case_Definition_t *CaseDefinition_p;
-} ADBG_Case_SuiteEntry_t;
+TAILQ_HEAD(adbg_case_def_head, adbg_case_def);
-typedef struct {
+typedef struct adbg_suite_def {
const char *SuiteID_p;
- const ADBG_Case_SuiteEntry_t *SuiteEntries_p;
+ struct adbg_case_def_head cases;
} ADBG_Suite_Definition_t;
+#define ADBG_CASE_DEFINE(Suite, TestID, Run, Title) \
+ __attribute__((constructor)) static void \
+ __adbg_test_case_ ## TestID(void) \
+ { \
+ static ADBG_Case_Definition_t case_def = { \
+ .TestID_p = #Suite "_" #TestID, \
+ .Title_p = Title, \
+ .Run_fp = Run, \
+ }; \
+ \
+ TAILQ_INSERT_TAIL(&(ADBG_Suite_ ## Suite).cases, \
+ &case_def, link); \
+ }
+
/*
* Suite definitions
*/
@@ -69,19 +75,13 @@ typedef struct {
* Declares a suite defined in a C-file.
*/
#define ADBG_SUITE_DECLARE(Name) \
- extern const ADBG_Suite_Definition_t ADBG_Suite_ ## Name;
-
-#define ADBG_SUITE_DEFINE_BEGIN(Name) \
- extern const ADBG_Case_SuiteEntry_t ADBG_SuiteEntries_ ## Name[]; \
- const ADBG_Suite_Definition_t ADBG_Suite_ ## Name = \
- { #Name, ADBG_SuiteEntries_ ## Name }; \
- const ADBG_Case_SuiteEntry_t ADBG_SuiteEntries_ ## Name[] = {
-/**
- * Defines a suite entry, this is the name of a case.
- */
-#define ADBG_SUITE_ENTRY(name) { &name },
+ extern ADBG_Suite_Definition_t ADBG_Suite_ ## Name
-#define ADBG_SUITE_DEFINE_END() { NULL } };
+#define ADBG_SUITE_DEFINE(Name) \
+ ADBG_Suite_Definition_t ADBG_Suite_ ## Name = { \
+ .SuiteID_p = #Name, \
+ .cases = TAILQ_HEAD_INITIALIZER(ADBG_Suite_ ## Name.cases), \
+ }
/*
* Enum table definitions
@@ -289,6 +289,8 @@ void Do_ADBG_HexLog(const void *const Buf_p, const size_t Size,
int Do_ADBG_RunSuite(const ADBG_Suite_Definition_t *Suite_p, int argc,
char *argv[]);
+int Do_ADBG_AppendToSuite(ADBG_Suite_Definition_t *Dest_p,
+ ADBG_Suite_Definition_t *Source_p);
/*
* SubCase functions
diff --git a/demos/optee_test/host/xtest/adbg/src/adbg_case.c b/demos/optee_test/host/xtest/adbg/src/adbg_case.c
index 9515d58..c59d5ea 100644
--- a/demos/optee_test/host/xtest/adbg/src/adbg_case.c
+++ b/demos/optee_test/host/xtest/adbg/src/adbg_case.c
@@ -45,13 +45,13 @@ static const char *ADBG_Case_GetTestID(ADBG_Case_t *Case_p);
/*************************************************************************
* 5. Definition of external functions
*************************************************************************/
-ADBG_Case_t *ADBG_Case_New(const ADBG_Case_SuiteEntry_t *SuiteEntry_p)
+ADBG_Case_t *ADBG_Case_New(const struct adbg_case_def *case_def)
{
ADBG_Case_t *Case_p;
Case_p = calloc(1, sizeof(*Case_p));
if (Case_p)
- Case_p->SuiteEntry_p = SuiteEntry_p;
+ Case_p->case_def = case_def;
return Case_p;
}
@@ -362,5 +362,5 @@ static const char *ADBG_Case_GetTestID(ADBG_Case_t *Case_p)
{
IDENTIFIER_NOT_USED(Case_p)
- return Case_p->SuiteEntry_p->CaseDefinition_p->TestID_p;
+ return Case_p->case_def->TestID_p;
}
diff --git a/demos/optee_test/host/xtest/adbg/src/adbg_int.h b/demos/optee_test/host/xtest/adbg/src/adbg_int.h
index 4df463b..705feab 100644
--- a/demos/optee_test/host/xtest/adbg/src/adbg_int.h
+++ b/demos/optee_test/host/xtest/adbg/src/adbg_int.h
@@ -33,7 +33,6 @@ typedef struct ADBG_Result {
int FirstFailedRow;
char const *FirstFailedFile_p;
bool AbortTestSuite;
- const char *WhySkipped_p;
} ADBG_Result_t;
TAILQ_HEAD(ADBG_SubCaseHead, ADBG_SubCase);
@@ -51,7 +50,7 @@ struct ADBG_SubCase {
/* Typedefed in t_adbg.h */
struct ADBG_Case {
- const ADBG_Case_SuiteEntry_t *SuiteEntry_p;
+ const struct adbg_case_def *case_def;
ADBG_SubCase_t *CurrentSubCase_p;
ADBG_SubCase_t *FirstSubCase_p;
@@ -73,7 +72,7 @@ void ADBG_Case_IterateSubCase(ADBG_Case_t *Case_p,
ADBG_SubCase_t *ADBG_Case_NextSubCase(ADBG_SubCase_Iterator_t *Iterator_p);
-ADBG_Case_t *ADBG_Case_New(const ADBG_Case_SuiteEntry_t *SuiteEntry_p);
+ADBG_Case_t *ADBG_Case_New(const struct adbg_case_def *case_def);
void ADBG_Case_Delete(ADBG_Case_t *Case_p);
diff --git a/demos/optee_test/host/xtest/adbg/src/adbg_run.c b/demos/optee_test/host/xtest/adbg/src/adbg_run.c
index aa47cf8..406e429 100644
--- a/demos/optee_test/host/xtest/adbg/src/adbg_run.c
+++ b/demos/optee_test/host/xtest/adbg/src/adbg_run.c
@@ -19,6 +19,16 @@
/*************************************************************************
* 2. Definition of external constants and variables
************************************************************************/
+#ifndef TAILQ_CONCAT
+#define TAILQ_CONCAT(head1, head2, field) do { \
+ if (!TAILQ_EMPTY(head2)) { \
+ *(head1)->tqh_last = (head2)->tqh_first; \
+ (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
+ (head1)->tqh_last = (head2)->tqh_last; \
+ TAILQ_INIT((head2)); \
+ } \
+} while (/*CONSTCOND*/0)
+#endif
/*************************************************************************
* 3. File scope types, constants and variables
@@ -66,6 +76,38 @@ int Do_ADBG_RunSuite(
return ret;
}
+int Do_ADBG_AppendToSuite(
+ ADBG_Suite_Definition_t *Dest_p,
+ ADBG_Suite_Definition_t *Source_p
+ )
+{
+ char *p;
+ size_t size;
+
+ /* Append name of 'Source_p' to name of 'Dest_p' */
+ size = strlen(Source_p->SuiteID_p);
+ if (Dest_p->SuiteID_p) {
+ size += strlen(Dest_p->SuiteID_p);
+ size += 1; /* '+' */
+ }
+ size += 1; /* '\0' */
+ p = malloc(size);
+ if (!p) {
+ fprintf(stderr, "malloc failed\n");
+ return -1;
+ }
+ if (Dest_p->SuiteID_p)
+ snprintf(p, size, "%s+%s", Dest_p->SuiteID_p,
+ Source_p->SuiteID_p);
+ else
+ strncpy(p, Source_p->SuiteID_p, size);
+ free((void *)Dest_p->SuiteID_p);
+ Dest_p->SuiteID_p = p;
+
+ TAILQ_CONCAT(&Dest_p->cases, &Source_p->cases, link);
+ return 0;
+}
+
/*************************************************************************
* 6. Definitions of internal functions
************************************************************************/
@@ -75,10 +117,10 @@ static int ADBG_RunSuite(
char *argv[]
)
{
- size_t n;
ADBG_Case_t *Case_p;
size_t NumSkippedTestCases = 0;
int failed_test = 0;
+ struct adbg_case_def *case_def;
Do_ADBG_Log("######################################################");
Do_ADBG_Log("#");
@@ -86,20 +128,14 @@ static int ADBG_RunSuite(
Do_ADBG_Log("#");
Do_ADBG_Log("######################################################");
- for (n = 0;
- Runner_p->Suite_p->SuiteEntries_p[n].CaseDefinition_p != NULL;
- n++) {
- const ADBG_Case_SuiteEntry_t *SuiteEntry_p =
- &Runner_p->Suite_p->SuiteEntries_p[n];
- const char *ti = SuiteEntry_p->CaseDefinition_p->TestID_p;
-
+ TAILQ_FOREACH(case_def, &Runner_p->Suite_p->cases, link) {
if (argc > 0) {
bool HaveMatch = false;
int i;
for (i = 0; i < argc; i++) {
- if (strstr(ti, argv[i])) {
+ if (strstr(case_def->TestID_p, argv[i])) {
HaveMatch = true;
break;
}
@@ -110,10 +146,10 @@ static int ADBG_RunSuite(
}
}
- Case_p = ADBG_Case_New(SuiteEntry_p);
+ Case_p = ADBG_Case_New(case_def);
if (Case_p == NULL) {
Do_ADBG_Log("HEAP_ALLOC failed for Case %s!",
- SuiteEntry_p->CaseDefinition_p->TestID_p);
+ case_def->TestID_p);
Runner_p->Result.AbortTestSuite = 1;
break;
}
@@ -121,18 +157,16 @@ static int ADBG_RunSuite(
TAILQ_INSERT_TAIL(&Runner_p->CasesList, Case_p, Link);
/* Start the parent test case */
- Do_ADBG_BeginSubCase(Case_p, "%s",
- SuiteEntry_p->CaseDefinition_p->Title_p);
+ Do_ADBG_BeginSubCase(Case_p, "%s", case_def->Title_p);
- SuiteEntry_p->CaseDefinition_p->Run_fp(Case_p);
+ case_def->Run_fp(Case_p);
/* End abondoned subcases */
while (Case_p->CurrentSubCase_p != Case_p->FirstSubCase_p)
Do_ADBG_EndSubCase(Case_p, NULL);
/* End the parent test case */
- Do_ADBG_EndSubCase(Case_p, "%s",
- SuiteEntry_p->CaseDefinition_p->Title_p);
+ Do_ADBG_EndSubCase(Case_p, "%s", case_def->Title_p);
/* Sum up the errors */
Runner_p->Result.NumTests += Case_p->Result.NumTests +
@@ -150,7 +184,7 @@ static int ADBG_RunSuite(
if (Runner_p->Result.AbortTestSuite) {
Do_ADBG_Log("Test suite aborted by %s!",
- SuiteEntry_p->CaseDefinition_p->TestID_p);
+ case_def->TestID_p);
break;
}
}
@@ -174,12 +208,8 @@ static int ADBG_RunSuite(
ADBG_Case_IterateSubCase(Case_p, &Iterator);
while ((SubCase_p = ADBG_Case_NextSubCase(&Iterator)) != NULL) {
- if (Case_p->Result.WhySkipped_p != NULL) {
- Do_ADBG_Log("%s SKIPPED: \"%s\"",
- SubCase_p->TestID_p,
- Case_p->Result.WhySkipped_p);
- } else if (SubCase_p->Result.NumFailedTests +
- SubCase_p->Result.NumFailedSubTests > 0) {
+ if (SubCase_p->Result.NumFailedTests +
+ SubCase_p->Result.NumFailedSubTests > 0) {
if (SubCase_p->Result.FirstFailedFile_p !=
NULL) {
Do_ADBG_Log(
diff --git a/demos/optee_test/host/xtest/aes_perf.c b/demos/optee_test/host/xtest/aes_perf.c
index 84e8c38..2705e49 100644
--- a/demos/optee_test/host/xtest/aes_perf.c
+++ b/demos/optee_test/host/xtest/aes_perf.c
@@ -58,8 +58,7 @@ static TEEC_SharedMemory out_shm = {
.flags = TEEC_MEM_INPUT | TEEC_MEM_OUTPUT
};
-static void __attribute__((noreturn))
-errx(const char *msg, TEEC_Result res)
+static void errx(const char *msg, TEEC_Result res)
{
fprintf(stderr, "%s: 0x%08x", msg, res);
exit (1);
@@ -149,8 +148,7 @@ static const char *mode_str(uint32_t mode)
static void usage(const char *progname, int keysize, int mode,
size_t size, int warmup, unsigned int l, unsigned int n)
{
- fprintf(stderr, "AES performance testing tool for OP-TEE (%s)\n\n",
- TO_STR(VERSION));
+ fprintf(stderr, "AES performance testing tool for OP-TEE\n\n");
fprintf(stderr, "Usage:\n");
fprintf(stderr, " %s -h\n", progname);
fprintf(stderr, " %s [-v] [-m mode] [-k keysize] ", progname);
@@ -312,8 +310,9 @@ void aes_perf_run_test(int mode, int keysize, int decrypt, size_t size,
struct timespec ts;
TEEC_Operation op;
int n0 = n;
+ double sd;
- vverbose("aes-perf version %s\n", TO_STR(VERSION));
+ vverbose("aes-perf\n");
if (clock_getres(CLOCK_MONOTONIC, &ts) < 0) {
perror("clock_getres");
return;
@@ -356,13 +355,18 @@ void aes_perf_run_test(int mode, int keysize, int decrypt, size_t size,
while (n-- > 0) {
t = run_test_once(in_shm.buffer, size, &op, random_in);
update_stats(&stats, t);
- if (n % (n0/10) == 0)
+ if (n % (n0 / 10) == 0)
vverbose("#");
}
vverbose("\n");
- printf("min=%gμs max=%gμs mean=%gμs stddev=%gμs (%gMiB/s)\n",
- stats.min/1000, stats.max/1000, stats.m/1000,
- stddev(&stats)/1000, mb_per_sec(size, stats.m));
+ sd = stddev(&stats);
+ printf("min=%gus max=%gus mean=%gus stddev=%gus (cv %g%%) (%gMiB/s)\n",
+ stats.min / 1000, stats.max / 1000, stats.m / 1000,
+ sd / 1000, 100 * sd / stats.m, mb_per_sec(size, stats.m));
+ verbose("2-sigma interval: %g..%gus (%g..%gMiB/s)\n",
+ (stats.m - 2 * sd) / 1000, (stats.m + 2 * sd) / 1000,
+ mb_per_sec(size, stats.m + 2 * sd),
+ mb_per_sec(size, stats.m - 2 * sd));
free_shm();
}
@@ -370,7 +374,7 @@ void aes_perf_run_test(int mode, int keysize, int decrypt, size_t size,
do { \
if (++i == argc) { \
fprintf(stderr, "%s: %s: missing argument\n", \
- argv[0], argv[i-1]); \
+ argv[0], argv[i - 1]); \
return 1; \
} \
} while (0);
@@ -458,7 +462,6 @@ int aes_perf_runner_cmd_parser(int argc, char *argv[])
}
}
-
aes_perf_run_test(mode, keysize, decrypt, size, n, l, random_in,
in_place, warmup, verbosity);
diff --git a/demos/optee_test/host/xtest/xtest_benchmark_1000.c b/demos/optee_test/host/xtest/benchmark_1000.c
index 8045102..bf92fa0 100644
--- a/demos/optee_test/host/xtest/xtest_benchmark_1000.c
+++ b/demos/optee_test/host/xtest/benchmark_1000.c
@@ -145,9 +145,9 @@ static void xtest_tee_benchmark_1003(ADBG_Case_t *c)
chunk_test(c, TA_STORAGE_BENCHMARK_CMD_TEST_REWRITE);
}
-ADBG_CASE_DEFINE(XTEST_TEE_BENCHMARK_1001, xtest_tee_benchmark_1001,
+ADBG_CASE_DEFINE(benchmark, 1001, xtest_tee_benchmark_1001,
"TEE Trusted Storage Performance Test (WRITE)");
-ADBG_CASE_DEFINE(XTEST_TEE_BENCHMARK_1002, xtest_tee_benchmark_1002,
+ADBG_CASE_DEFINE(benchmark, 1002, xtest_tee_benchmark_1002,
"TEE Trusted Storage Performance Test (READ)");
-ADBG_CASE_DEFINE(XTEST_TEE_BENCHMARK_1003, xtest_tee_benchmark_1003,
+ADBG_CASE_DEFINE(benchmark, 1003, xtest_tee_benchmark_1003,
"TEE Trusted Storage Performance Test (REWRITE)");
diff --git a/demos/optee_test/host/xtest/xtest_benchmark_2000.c b/demos/optee_test/host/xtest/benchmark_2000.c
index 9711a9a..7ab9cb8 100644
--- a/demos/optee_test/host/xtest/xtest_benchmark_2000.c
+++ b/demos/optee_test/host/xtest/benchmark_2000.c
@@ -61,9 +61,9 @@ static void xtest_tee_benchmark_2002(ADBG_Case_t *c)
}
-ADBG_CASE_DEFINE(XTEST_TEE_BENCHMARK_2001, xtest_tee_benchmark_2001,
+ADBG_CASE_DEFINE(benchmark, 2001, xtest_tee_benchmark_2001,
"TEE SHA Performance test (TA_SHA_SHA1)");
-ADBG_CASE_DEFINE(XTEST_TEE_BENCHMARK_2002, xtest_tee_benchmark_2002,
+ADBG_CASE_DEFINE(benchmark, 2002, xtest_tee_benchmark_2002,
"TEE SHA Performance test (TA_SHA_SHA226)");
@@ -99,7 +99,7 @@ static void xtest_tee_benchmark_2012(ADBG_Case_t *c)
CRYPTO_DEF_WARMUP, CRYPTO_DEF_VERBOSITY);
}
-ADBG_CASE_DEFINE(XTEST_TEE_BENCHMARK_2011, xtest_tee_benchmark_2011,
+ADBG_CASE_DEFINE(benchmark, 2011, xtest_tee_benchmark_2011,
"TEE AES Performance test (TA_AES_ECB)");
-ADBG_CASE_DEFINE(XTEST_TEE_BENCHMARK_2012, xtest_tee_benchmark_2012,
+ADBG_CASE_DEFINE(benchmark, 2012, xtest_tee_benchmark_2012,
"TEE AES Performance test (TA_AES_CBC)");
diff --git a/demos/optee_test/host/xtest/crypto_common.h b/demos/optee_test/host/xtest/crypto_common.h
index cd9edd4..096c27b 100644
--- a/demos/optee_test/host/xtest/crypto_common.h
+++ b/demos/optee_test/host/xtest/crypto_common.h
@@ -68,6 +68,8 @@ void sha_perf_run_test(int algo, size_t size, unsigned int n,
unsigned int l, int random_in, int offset,
int warmup, int verbosity);
-
+#ifdef CFG_SECURE_DATA_PATH
+int sdp_basic_runner_cmd_parser(int argc, char *argv[]);
+#endif
#endif /* XTEST_CRYPTO_PERF_H */
diff --git a/demos/optee_test/host/xtest/include/uapi/linux/ion.h b/demos/optee_test/host/xtest/include/uapi/linux/ion.h
new file mode 100644
index 0000000..e7e20ff
--- a/dev/null
+++ b/demos/optee_test/host/xtest/include/uapi/linux/ion.h
@@ -0,0 +1,238 @@
+/*
+ * drivers/staging/android/uapi/ion.h
+ *
+ * Copyright (C) 2011 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef _UAPI_LINUX_ION_H
+#define _UAPI_LINUX_ION_H
+
+#include <linux/ioctl.h>
+#include <linux/types.h>
+
+typedef int ion_user_handle_t;
+
+/**
+ * enum ion_heap_types - list of all possible types of heaps
+ * @ION_HEAP_TYPE_SYSTEM: memory allocated via vmalloc
+ * @ION_HEAP_TYPE_SYSTEM_CONTIG: memory allocated via kmalloc
+ * @ION_HEAP_TYPE_CARVEOUT: memory allocated from a prereserved
+ * carveout heap, allocations are physically
+ * contiguous
+ * @ION_HEAP_TYPE_DMA: memory allocated via DMA API
+ * @ION_HEAP_TYPE_UNMAPPED: memory not mappable into linux address space
+ * @ION_NUM_HEAPS: helper for iterating over heaps, a bit mask
+ * is used to identify the heaps, so only 32
+ * total heap types are supported
+ */
+enum ion_heap_type {
+ ION_HEAP_TYPE_SYSTEM,
+ ION_HEAP_TYPE_SYSTEM_CONTIG,
+ ION_HEAP_TYPE_CARVEOUT,
+ ION_HEAP_TYPE_CHUNK,
+ ION_HEAP_TYPE_DMA,
+ ION_HEAP_TYPE_UNMAPPED,
+ ION_HEAP_TYPE_CUSTOM, /*
+ * must be last so device specific heaps always
+ * are at the end of this enum
+ */
+};
+
+#define ION_NUM_HEAP_IDS (sizeof(unsigned int) * 8)
+
+/**
+ * allocation flags - the lower 16 bits are used by core ion, the upper 16
+ * bits are reserved for use by the heaps themselves.
+ */
+
+/*
+ * mappings of this buffer should be cached, ion will do cache maintenance
+ * when the buffer is mapped for dma
+ */
+#define ION_FLAG_CACHED 1
+
+/*
+ * mappings of this buffer will created at mmap time, if this is set
+ * caches must be managed manually
+ */
+#define ION_FLAG_CACHED_NEEDS_SYNC 2
+
+/**
+ * DOC: Ion Userspace API
+ *
+ * create a client by opening /dev/ion
+ * most operations handled via following ioctls
+ *
+ */
+
+/**
+ * struct ion_allocation_data - metadata passed from userspace for allocations
+ * @len: size of the allocation
+ * @align: required alignment of the allocation
+ * @heap_id_mask: mask of heap ids to allocate from
+ * @flags: flags passed to heap
+ * @handle: pointer that will be populated with a cookie to use to
+ * refer to this allocation
+ *
+ * Provided by userspace as an argument to the ioctl
+ */
+struct ion_allocation_data {
+ size_t len;
+ size_t align;
+ unsigned int heap_id_mask;
+ unsigned int flags;
+ ion_user_handle_t handle;
+};
+
+/**
+ * struct ion_fd_data - metadata passed to/from userspace for a handle/fd pair
+ * @handle: a handle
+ * @fd: a file descriptor representing that handle
+ *
+ * For ION_IOC_SHARE or ION_IOC_MAP userspace populates the handle field with
+ * the handle returned from ion alloc, and the kernel returns the file
+ * descriptor to share or map in the fd field. For ION_IOC_IMPORT, userspace
+ * provides the file descriptor and the kernel returns the handle.
+ */
+struct ion_fd_data {
+ ion_user_handle_t handle;
+ int fd;
+};
+
+/**
+ * struct ion_handle_data - a handle passed to/from the kernel
+ * @handle: a handle
+ */
+struct ion_handle_data {
+ ion_user_handle_t handle;
+};
+
+/**
+ * struct ion_custom_data - metadata passed to/from userspace for a custom ioctl
+ * @cmd: the custom ioctl function to call
+ * @arg: additional data to pass to the custom ioctl, typically a user
+ * pointer to a predefined structure
+ *
+ * This works just like the regular cmd and arg fields of an ioctl.
+ */
+struct ion_custom_data {
+ unsigned int cmd;
+ unsigned long arg;
+};
+
+#define MAX_HEAP_NAME 32
+
+/**
+ * struct ion_heap_data - data about a heap
+ * @name - first 32 characters of the heap name
+ * @type - heap type
+ * @heap_id - heap id for the heap
+ */
+struct ion_heap_data {
+ char name[MAX_HEAP_NAME];
+ __u32 type;
+ __u32 heap_id;
+ __u32 reserved0;
+ __u32 reserved1;
+ __u32 reserved2;
+};
+
+/**
+ * struct ion_heap_query - collection of data about all heaps
+ * @cnt - total number of heaps to be copied
+ * @heaps - buffer to copy heap data
+ */
+struct ion_heap_query {
+ __u32 cnt; /* Total number of heaps to be copied */
+ __u32 reserved0; /* align to 64bits */
+ __u64 heaps; /* buffer to be populated */
+ __u32 reserved1;
+ __u32 reserved2;
+};
+
+#define ION_IOC_MAGIC 'I'
+
+/**
+ * DOC: ION_IOC_ALLOC - allocate memory
+ *
+ * Takes an ion_allocation_data struct and returns it with the handle field
+ * populated with the opaque handle for the allocation.
+ */
+#define ION_IOC_ALLOC _IOWR(ION_IOC_MAGIC, 0, \
+ struct ion_allocation_data)
+
+/**
+ * DOC: ION_IOC_FREE - free memory
+ *
+ * Takes an ion_handle_data struct and frees the handle.
+ */
+#define ION_IOC_FREE _IOWR(ION_IOC_MAGIC, 1, struct ion_handle_data)
+
+/**
+ * DOC: ION_IOC_MAP - get a file descriptor to mmap
+ *
+ * Takes an ion_fd_data struct with the handle field populated with a valid
+ * opaque handle. Returns the struct with the fd field set to a file
+ * descriptor open in the current address space. This file descriptor
+ * can then be used as an argument to mmap.
+ */
+#define ION_IOC_MAP _IOWR(ION_IOC_MAGIC, 2, struct ion_fd_data)
+
+/**
+ * DOC: ION_IOC_SHARE - creates a file descriptor to use to share an allocation
+ *
+ * Takes an ion_fd_data struct with the handle field populated with a valid
+ * opaque handle. Returns the struct with the fd field set to a file
+ * descriptor open in the current address space. This file descriptor
+ * can then be passed to another process. The corresponding opaque handle can
+ * be retrieved via ION_IOC_IMPORT.
+ */
+#define ION_IOC_SHARE _IOWR(ION_IOC_MAGIC, 4, struct ion_fd_data)
+
+/**
+ * DOC: ION_IOC_IMPORT - imports a shared file descriptor
+ *
+ * Takes an ion_fd_data struct with the fd field populated with a valid file
+ * descriptor obtained from ION_IOC_SHARE and returns the struct with the handle
+ * filed set to the corresponding opaque handle.
+ */
+#define ION_IOC_IMPORT _IOWR(ION_IOC_MAGIC, 5, struct ion_fd_data)
+
+/**
+ * DOC: ION_IOC_SYNC - syncs a shared file descriptors to memory
+ *
+ * Deprecated in favor of using the dma_buf api's correctly (syncing
+ * will happen automatically when the buffer is mapped to a device).
+ * If necessary should be used after touching a cached buffer from the cpu,
+ * this will make the buffer in memory coherent.
+ */
+#define ION_IOC_SYNC _IOWR(ION_IOC_MAGIC, 7, struct ion_fd_data)
+
+/**
+ * DOC: ION_IOC_CUSTOM - call architecture specific ion ioctl
+ *
+ * Takes the argument of the architecture specific ioctl to call and
+ * passes appropriate userdata for that ioctl
+ */
+#define ION_IOC_CUSTOM _IOWR(ION_IOC_MAGIC, 6, struct ion_custom_data)
+
+/**
+ * DOC: ION_IOC_HEAP_QUERY - information about available heaps
+ *
+ * Takes an ion_heap_query structure and populates information about
+ * available Ion heaps.
+ */
+#define ION_IOC_HEAP_QUERY _IOWR(ION_IOC_MAGIC, 8, \
+ struct ion_heap_query)
+
+#endif /* _UAPI_LINUX_ION_H */
diff --git a/demos/optee_test/host/xtest/rand_stream.c b/demos/optee_test/host/xtest/rand_stream.c
new file mode 100644
index 0000000..671d415
--- a/dev/null
+++ b/demos/optee_test/host/xtest/rand_stream.c
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2016, Linaro Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License Version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+#include <sys/types.h>
+
+#include "rand_stream.h"
+
+#define STREAM_BUF_MIN_SIZE 4
+
+struct rand_stream {
+ int32_t seed;
+ uint8_t word_buf[4];
+ size_t w_offs;
+ size_t sb_size;
+ size_t sb_offs;
+ uint8_t stream_buf[];
+};
+
+struct rand_stream *rand_stream_alloc(int seed, size_t stream_buffer_size)
+{
+ size_t sb_size = MAX(stream_buffer_size, STREAM_BUF_MIN_SIZE);
+ struct rand_stream *rs = calloc(1, sizeof(*rs) + sb_size);
+
+ if (!rs)
+ return NULL;
+
+ rs->sb_size = sb_size;;
+ rs->sb_offs = rs->sb_size;
+ rs->w_offs = sizeof(rs->word_buf);
+ rs->seed = seed;
+
+ return rs;
+}
+
+void rand_stream_free(struct rand_stream *rs)
+{
+ free(rs);
+}
+
+static void get_random(struct rand_stream *rs, uint8_t *buf, size_t blen)
+{
+ uint8_t *b = buf;
+ size_t l = blen;
+
+
+ /*
+ * This function uses an LCG,
+ * https://en.wikipedia.org/wiki/Linear_congruential_generator
+ * to generate the byte stream.
+ */
+
+ while (l) {
+ size_t t = MIN(sizeof(rs->word_buf) - rs->w_offs, l);
+
+ memcpy(b, rs->word_buf + rs->w_offs, t);
+ rs->w_offs += t;
+ l -= t;
+ b += t;
+
+ if (rs->w_offs == sizeof(rs->word_buf)) {
+ rs->seed = rs->seed * 1103515245 + 12345;
+ memcpy(rs->word_buf, &rs->seed, sizeof(rs->seed));
+ rs->w_offs = 0;
+ }
+ }
+}
+
+const void *rand_stream_peek(struct rand_stream *rs, size_t *num_bytes)
+{
+ if (rs->sb_offs == rs->sb_size) {
+ rs->sb_offs = 0;
+ get_random(rs, rs->stream_buf, rs->sb_size);
+ }
+
+ *num_bytes = MIN(*num_bytes, rs->sb_size - rs->sb_offs);
+ return rs->stream_buf + rs->sb_offs;
+}
+
+void rand_stream_read(struct rand_stream *rs, void *buf, size_t num_bytes)
+{
+ size_t peek_bytes = num_bytes;
+ const void *peek = rand_stream_peek(rs, &peek_bytes);
+
+ memcpy(buf, peek, peek_bytes);
+ rand_stream_advance(rs, peek_bytes);
+
+ if (num_bytes - peek_bytes)
+ get_random(rs, (uint8_t *)buf + peek_bytes,
+ num_bytes - peek_bytes);
+}
+
+void rand_stream_advance(struct rand_stream *rs, size_t num_bytes)
+{
+ size_t nb = num_bytes;
+
+ if (nb <= (rs->sb_size - rs->sb_offs)) {
+ rs->sb_offs += nb;
+ return;
+ }
+
+ nb -= rs->sb_size - rs->sb_offs;
+ rs->sb_offs = rs->sb_size;
+
+ while (nb > rs->sb_size) {
+ get_random(rs, rs->stream_buf, rs->sb_size);
+ nb -= rs->sb_size;
+ }
+
+ get_random(rs, rs->stream_buf, rs->sb_size);
+ rs->sb_offs = nb;
+}
diff --git a/demos/optee_test/host/xtest/rand_stream.h b/demos/optee_test/host/xtest/rand_stream.h
new file mode 100644
index 0000000..2c7db52
--- a/dev/null
+++ b/demos/optee_test/host/xtest/rand_stream.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2016, Linaro Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License Version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __RAND_STREAM_H
+#define __RAND_STREAM_H
+
+#include <sys/types.h>
+
+struct rand_stream;
+
+struct rand_stream *rand_stream_alloc(int seed, size_t stream_buffer_size);
+void rand_stream_free(struct rand_stream *rs);
+
+const void *rand_stream_peek(struct rand_stream *rs, size_t *num_bytes);
+void rand_stream_advance(struct rand_stream *rs, size_t num_bytes);
+void rand_stream_read(struct rand_stream *rs, void *buf, size_t num_bytes);
+
+#endif /*__RAND_STREAM_H*/
diff --git a/demos/optee_test/host/xtest/xtest_1000.c b/demos/optee_test/host/xtest/regression_1000.c
index 785f86e..18d011d 100644
--- a/demos/optee_test/host/xtest/xtest_1000.c
+++ b/demos/optee_test/host/xtest/regression_1000.c
@@ -23,12 +23,14 @@
#include "xtest_helpers.h"
#include <signed_hdr.h>
+#include <pta_invoke_tests.h>
#include <ta_crypt.h>
#include <ta_os_test.h>
#include <ta_create_fail_test.h>
#include <ta_rpc_test.h>
#include <ta_sims_test.h>
#include <ta_concurrent.h>
+#include <sdp_basic.h>
static void xtest_tee_test_1001(ADBG_Case_t *Case_p);
static void xtest_tee_test_1004(ADBG_Case_t *Case_p);
@@ -41,22 +43,34 @@ static void xtest_tee_test_1010(ADBG_Case_t *Case_p);
static void xtest_tee_test_1011(ADBG_Case_t *Case_p);
static void xtest_tee_test_1012(ADBG_Case_t *Case_p);
static void xtest_tee_test_1013(ADBG_Case_t *Case_p);
-
-ADBG_CASE_DEFINE(XTEST_TEE_1001, xtest_tee_test_1001, "Core self tests");
-ADBG_CASE_DEFINE(XTEST_TEE_1004, xtest_tee_test_1004, "Test User Crypt TA");
-ADBG_CASE_DEFINE(XTEST_TEE_1005, xtest_tee_test_1005, "Many sessions");
-ADBG_CASE_DEFINE(XTEST_TEE_1006, xtest_tee_test_1006, "Test Basic OS features");
-ADBG_CASE_DEFINE(XTEST_TEE_1007, xtest_tee_test_1007, "Test Panic");
-ADBG_CASE_DEFINE(XTEST_TEE_1008, xtest_tee_test_1008,
+#ifdef CFG_SECURE_DATA_PATH
+static void xtest_tee_test_1014(ADBG_Case_t *Case_p);
+#endif
+static void xtest_tee_test_1015(ADBG_Case_t *Case_p);
+
+ADBG_CASE_DEFINE(regression, 1001, xtest_tee_test_1001, "Core self tests");
+ADBG_CASE_DEFINE(regression, 1004, xtest_tee_test_1004, "Test User Crypt TA");
+ADBG_CASE_DEFINE(regression, 1005, xtest_tee_test_1005, "Many sessions");
+ADBG_CASE_DEFINE(regression, 1006, xtest_tee_test_1006,
+ "Test Basic OS features");
+ADBG_CASE_DEFINE(regression, 1007, xtest_tee_test_1007, "Test Panic");
+ADBG_CASE_DEFINE(regression, 1008, xtest_tee_test_1008,
"TEE internal client API");
-ADBG_CASE_DEFINE(XTEST_TEE_1009, xtest_tee_test_1009, "TEE Wait");
-ADBG_CASE_DEFINE(XTEST_TEE_1010, xtest_tee_test_1010, "Invalid memory access");
-ADBG_CASE_DEFINE(XTEST_TEE_1011, xtest_tee_test_1011,
- "Test RPC features with User Crypt TA");
-ADBG_CASE_DEFINE(XTEST_TEE_1012, xtest_tee_test_1012,
+ADBG_CASE_DEFINE(regression, 1009, xtest_tee_test_1009, "TEE Wait");
+ADBG_CASE_DEFINE(regression, 1010, xtest_tee_test_1010,
+ "Invalid memory access");
+ADBG_CASE_DEFINE(regression, 1011, xtest_tee_test_1011,
+ "Test TA-to-TA features with User Crypt TA");
+ADBG_CASE_DEFINE(regression, 1012, xtest_tee_test_1012,
"Test Single Instance Multi Session features with SIMS TA");
-ADBG_CASE_DEFINE(XTEST_TEE_1013, xtest_tee_test_1013,
+ADBG_CASE_DEFINE(regression, 1013, xtest_tee_test_1013,
"Test concurency with concurrent TA");
+#ifdef CFG_SECURE_DATA_PATH
+ADBG_CASE_DEFINE(regression, 1014, xtest_tee_test_1014,
+ "Test secure data path against SDP TAs and pTAs");
+#endif
+ADBG_CASE_DEFINE(regression, 1015, xtest_tee_test_1015,
+ "FS hash-tree corner cases");
struct xtest_crypto_session {
ADBG_Case_t *c;
@@ -257,9 +271,7 @@ static void xtest_tee_test_1001(ADBG_Case_t *c)
TEEC_Session session = { 0 };
uint32_t ret_orig;
-#define CMD_SELF_TESTS 2
-
- res = xtest_teec_open_session(&session, &sta_test_ta_uuid, NULL,
+ res = xtest_teec_open_session(&session, &pta_invoke_tests_ta_uuid, NULL,
&ret_orig);
/*
* If the static TA (which is optional) isn't available, skip this
@@ -269,7 +281,7 @@ static void xtest_tee_test_1001(ADBG_Case_t *c)
return;
(void)ADBG_EXPECT_TEEC_SUCCESS(c, TEEC_InvokeCommand(
- &session, CMD_SELF_TESTS, NULL, &ret_orig));
+ &session, PTA_INVOKE_TESTS_CMD_SELF_TESTS, NULL, &ret_orig));
TEEC_CloseSession(&session);
}
@@ -396,9 +408,13 @@ static void xtest_tee_test_1007(ADBG_Case_t *c)
TEEC_CloseSession(&session);
}
-#if 0
+
#ifndef TA_DIR
+# ifdef __ANDROID__
+#define TA_DIR "/system/lib/optee_armtz"
+# else
#define TA_DIR "/lib/optee_armtz"
+# endif
#endif
#ifndef TA_TEST_DIR
@@ -553,7 +569,7 @@ static bool load_corrupt_ta(ADBG_Case_t *c, long offs, uint8_t mask)
r &= ADBG_EXPECT_TRUE(c, rm_file(&create_fail_test_ta_uuid));
return r;
}
-#endif
+
static void xtest_tee_test_1008(ADBG_Case_t *c)
{
TEEC_Session session = { 0 };
@@ -618,7 +634,7 @@ static void xtest_tee_test_1008(ADBG_Case_t *c)
}
}
Do_ADBG_EndSubCase(c, "Create session fail");
-#if 0
+
make_test_ta_dir();
Do_ADBG_BeginSubCase(c, "Load fake uuid TA");
@@ -645,7 +661,6 @@ static void xtest_tee_test_1008(ADBG_Case_t *c)
ADBG_EXPECT_TRUE(c, load_corrupt_ta(c, 3000, 1)); /* payload */
ADBG_EXPECT_TRUE(c, load_corrupt_ta(c, 30000, 1)); /* payload */
Do_ADBG_EndSubCase(c, "Load corrupt TA");
-#endif
}
static void *cancellation_thread(void *arg)
@@ -737,16 +752,34 @@ static void xtest_tee_test_1011(ADBG_Case_t *c)
TA_RPC_CMD_CRYPT_AES256ECB_ENC,
TA_RPC_CMD_CRYPT_AES256ECB_DEC
};
+ struct xtest_crypto_session cs_privmem = {
+ c, &session,
+ TA_RPC_CMD_CRYPT_PRIVMEM_SHA256,
+ TA_RPC_CMD_CRYPT_PRIVMEM_AES256ECB_ENC,
+ TA_RPC_CMD_CRYPT_PRIVMEM_AES256ECB_DEC
+ };
TEEC_UUID uuid = rpc_test_ta_uuid;
if (!ADBG_EXPECT_TEEC_SUCCESS(c,
xtest_teec_open_session(&session, &uuid, NULL, &ret_orig)))
return;
+ Do_ADBG_BeginSubCase(c, "TA-to-TA via non-secure shared memory");
/*
- * Run the "complete crypto test suite" using RPC
+ * Run the "complete crypto test suite" using TA-to-TA
+ * communication
*/
xtest_crypto_test(&cs);
+ Do_ADBG_EndSubCase(c, "TA-to-TA via non-secure shared memory");
+
+ Do_ADBG_BeginSubCase(c, "TA-to-TA via TA private memory");
+ /*
+ * Run the "complete crypto test suite" using TA-to-TA
+ * communication via TA private memory.
+ */
+ xtest_crypto_test(&cs_privmem);
+ Do_ADBG_EndSubCase(c, "TA-to-TA via TA private memory");
+
TEEC_CloseSession(&session);
}
@@ -1050,3 +1083,62 @@ static void xtest_tee_test_1013(ADBG_Case_t *c)
Do_ADBG_EndSubCase(c, "Using large concurrency TA");
#endif
}
+
+#ifdef CFG_SECURE_DATA_PATH
+static void xtest_tee_test_1014(ADBG_Case_t *c)
+{
+ UNUSED(c);
+
+ int size = 17000;
+ int loop = 10;
+ int ion_heap = DEFAULT_ION_HEAP_TYPE;
+ int rnd_offset = 1;
+ int test;
+ int ret;
+
+ test = TEST_NS_TO_TA;
+ Do_ADBG_BeginSubCase(c, "SDP: NonSecure client invokes a SDP TA");
+ ret = sdp_basic_test(test, size, loop, ion_heap, rnd_offset);
+ ADBG_EXPECT(c, 0, ret);
+ Do_ADBG_EndSubCase(c, "SDP: NonSecure client invokes a SDP TA");
+
+ test = TEST_TA_TO_TA;
+ Do_ADBG_BeginSubCase(c, "SDP: SDP TA invokes a SDP TA");
+ ret = sdp_basic_test(test, size, loop, ion_heap, rnd_offset);
+ ADBG_EXPECT(c, 0, ret);
+ Do_ADBG_EndSubCase(c, "SDP: SDP TA invokes a SDP TA");
+
+ test = TEST_TA_TO_PTA;
+ Do_ADBG_BeginSubCase(c, "SDP: SDP TA invokes a SDP pTA");
+ ret = sdp_basic_test(test, size, loop, ion_heap, rnd_offset);
+ ADBG_EXPECT(c, 0, ret);
+ Do_ADBG_EndSubCase(c, "SDP: SDP TA invokes a SDP pTA");
+
+ test = TEST_NS_TO_PTA;
+ Do_ADBG_BeginSubCase(c, "SDP: NonSecure client invokes SDP pTA (should fail)");
+ ret = sdp_basic_test(test, size, loop, ion_heap, rnd_offset);
+ ADBG_EXPECT(c, 1, ret);
+ Do_ADBG_EndSubCase(c, "SDP: NonSecure client invokes SDP pTA (should fail)");
+}
+#endif
+
+static void xtest_tee_test_1015(ADBG_Case_t *c)
+{
+ TEEC_Result res;
+ TEEC_Session session = { 0 };
+ uint32_t ret_orig;
+
+ res = xtest_teec_open_session(&session, &pta_invoke_tests_ta_uuid, NULL,
+ &ret_orig);
+ /*
+ * If the static TA (which is optional) isn't available, skip this
+ * test.
+ */
+ if (res != TEEC_SUCCESS)
+ return;
+
+ ADBG_EXPECT_TEEC_SUCCESS(c,
+ TEEC_InvokeCommand(&session, PTA_INVOKE_TESTS_CMD_FS_HTREE,
+ NULL, &ret_orig));
+ TEEC_CloseSession(&session);
+}
diff --git a/demos/optee_test/host/xtest/regression_2000.c b/demos/optee_test/host/xtest/regression_2000.c
new file mode 100644
index 0000000..3cba3ee
--- a/dev/null
+++ b/demos/optee_test/host/xtest/regression_2000.c
@@ -0,0 +1,908 @@
+/*
+ * Copyright (c) 2016, Linaro Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License Version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <assert.h>
+#include <err.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <ta_socket.h>
+#include <tee_isocket.h>
+#include <tee_tcpsocket.h>
+#include <__tee_tcpsocket_defines_extensions.h>
+#include <tee_udpsocket.h>
+#include <unistd.h>
+
+#include "xtest_test.h"
+#include "xtest_helpers.h"
+#include "sock_server.h"
+#include "rand_stream.h"
+
+struct socket_handle {
+ uint64_t buf[2];
+ size_t blen;
+};
+
+static TEE_Result socket_tcp_open(TEEC_Session *session, uint32_t ip_vers,
+ const char *addr, uint16_t port,
+ struct socket_handle *handle,
+ uint32_t *error, uint32_t *ret_orig)
+{
+ TEE_Result res;
+ TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
+
+ memset(handle, 0, sizeof(*handle));
+
+ op.params[0].value.a = ip_vers;
+ op.params[0].value.b = port;
+ op.params[1].tmpref.buffer = (void *)addr;
+ op.params[1].tmpref.size = strlen(addr) + 1;
+ op.params[2].tmpref.buffer = handle->buf;
+ op.params[2].tmpref.size = sizeof(handle->buf);
+
+ op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
+ TEEC_MEMREF_TEMP_INPUT,
+ TEEC_MEMREF_TEMP_OUTPUT,
+ TEEC_VALUE_OUTPUT);
+
+ res = TEEC_InvokeCommand(session, TA_SOCKET_CMD_TCP_OPEN,
+ &op, ret_orig);
+
+ handle->blen = op.params[2].tmpref.size;
+ *error = op.params[3].value.a;
+ return res;
+}
+
+static TEE_Result socket_udp_open(TEEC_Session *session, uint32_t ip_vers,
+ const char *addr, uint16_t port,
+ struct socket_handle *handle,
+ uint32_t *error, uint32_t *ret_orig)
+{
+ TEE_Result res;
+ TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
+
+ memset(handle, 0, sizeof(*handle));
+
+ op.params[0].value.a = ip_vers;
+ op.params[0].value.b = port;
+ op.params[1].tmpref.buffer = (void *)addr;
+ op.params[1].tmpref.size = strlen(addr) + 1;
+ op.params[2].tmpref.buffer = handle->buf;
+ op.params[2].tmpref.size = sizeof(handle->buf);
+
+ op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
+ TEEC_MEMREF_TEMP_INPUT,
+ TEEC_MEMREF_TEMP_OUTPUT,
+ TEEC_VALUE_OUTPUT);
+
+ res = TEEC_InvokeCommand(session, TA_SOCKET_CMD_UDP_OPEN,
+ &op, ret_orig);
+
+ handle->blen = op.params[2].tmpref.size;
+ *error = op.params[3].value.a;
+ return res;
+}
+
+static TEE_Result socket_send(TEEC_Session *session,
+ struct socket_handle *handle,
+ const void *data, size_t *dlen,
+ uint32_t timeout, uint32_t *ret_orig)
+{
+ TEE_Result res;
+ TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
+
+ op.params[0].tmpref.buffer = handle->buf;
+ op.params[0].tmpref.size = handle->blen;
+ op.params[1].tmpref.buffer = (void *)data;
+ op.params[1].tmpref.size = *dlen;
+ op.params[2].value.a = timeout;
+
+ op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
+ TEEC_MEMREF_TEMP_INPUT,
+ TEEC_VALUE_INOUT, TEEC_NONE);
+
+ res = TEEC_InvokeCommand(session, TA_SOCKET_CMD_SEND, &op, ret_orig);
+
+ *dlen = op.params[2].value.b;
+ return res;
+}
+
+static TEE_Result socket_recv(TEEC_Session *session,
+ struct socket_handle *handle,
+ void *data, size_t *dlen,
+ uint32_t timeout, uint32_t *ret_orig)
+{
+ TEE_Result res;
+ TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
+
+ op.params[0].tmpref.buffer = handle->buf;
+ op.params[0].tmpref.size = handle->blen;
+ op.params[1].tmpref.buffer = (void *)data;
+ op.params[1].tmpref.size = *dlen;
+ op.params[2].value.a = timeout;
+
+ op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
+ TEEC_MEMREF_TEMP_OUTPUT,
+ TEEC_VALUE_INPUT, TEEC_NONE);
+
+ res = TEEC_InvokeCommand(session, TA_SOCKET_CMD_RECV, &op, ret_orig);
+
+ *dlen = op.params[1].tmpref.size;
+ return res;
+}
+
+static TEE_Result socket_get_error(TEEC_Session *session,
+ struct socket_handle *handle,
+ uint32_t *proto_error, uint32_t *ret_orig)
+{
+ TEE_Result res;
+ TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
+
+ op.params[0].tmpref.buffer = handle->buf;
+ op.params[0].tmpref.size = handle->blen;
+
+ op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
+ TEEC_VALUE_OUTPUT,
+ TEEC_NONE, TEEC_NONE);
+
+ res = TEEC_InvokeCommand(session, TA_SOCKET_CMD_ERROR, &op, ret_orig);
+
+ *proto_error = op.params[1].value.a;
+ return res;
+}
+
+static TEE_Result socket_close(TEEC_Session *session,
+ struct socket_handle *handle, uint32_t *ret_orig)
+{
+ TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
+
+ op.params[0].tmpref.buffer = handle->buf;
+ op.params[0].tmpref.size = handle->blen;
+
+ op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
+ TEEC_NONE, TEEC_NONE, TEEC_NONE);
+
+ return TEEC_InvokeCommand(session, TA_SOCKET_CMD_CLOSE, &op, ret_orig);
+}
+
+static TEE_Result socket_ioctl(TEEC_Session *session,
+ struct socket_handle *handle, uint32_t ioctl_cmd,
+ void *data, size_t *dlen, uint32_t *ret_orig)
+{
+ TEE_Result res;
+ TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
+
+ op.params[0].tmpref.buffer = handle->buf;
+ op.params[0].tmpref.size = handle->blen;
+ op.params[1].tmpref.buffer = data;
+ op.params[1].tmpref.size = *dlen;
+ op.params[2].value.a = ioctl_cmd;
+
+ op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
+ TEEC_MEMREF_TEMP_INOUT,
+ TEEC_VALUE_INPUT, TEEC_NONE);
+
+ res = TEEC_InvokeCommand(session, TA_SOCKET_CMD_IOCTL, &op, ret_orig);
+
+ *dlen = op.params[1].tmpref.size;
+ return res;
+}
+
+
+
+struct test_200x_io_state {
+ struct rand_stream *read_rs;
+ struct rand_stream *write_rs;
+ bool rfail;
+};
+
+static void test_200x_init_io_state(struct test_200x_io_state *s,
+ int read_seed, int write_seed)
+{
+ memset(s, 0, sizeof(*s));
+ s->read_rs = rand_stream_alloc(read_seed, 100);
+ s->write_rs = rand_stream_alloc(write_seed, 100);
+ assert(s->read_rs && s->write_rs);
+}
+
+static bool test_200x_tcp_accept_cb(void *ptr, int fd, short *events)
+{
+ (void)ptr;
+ (void)fd;
+ (void)events;
+ return true;
+}
+
+static bool test_200x_tcp_read_cb(void *ptr, int fd, short *events)
+{
+ struct test_200x_io_state *iostate = ptr;
+ ssize_t r;
+ uint8_t buf[100];
+ uint8_t buf2[100];
+
+ (void)events;
+ r = read(fd, buf, sizeof(buf));
+ if (r <= 0)
+ return false;
+
+ rand_stream_read(iostate->read_rs, buf2, r);
+ if (memcmp(buf, buf2, r)) {
+ iostate->rfail = true;
+ return false;
+ }
+
+ return true;
+}
+
+static bool test_200x_tcp_write_cb(void *ptr, int fd, short *events)
+{
+ struct test_200x_io_state *iostate = ptr;
+ size_t num_bytes = 100;
+ const void *bytes;
+ ssize_t r;
+
+ (void)events;
+
+ bytes = rand_stream_peek(iostate->write_rs, &num_bytes);
+ r = write(fd, bytes, num_bytes);
+ if (r < 0)
+ return false;
+
+ rand_stream_advance(iostate->write_rs, num_bytes);
+ return true;
+}
+
+static void xtest_tee_test_2001(ADBG_Case_t *c)
+{
+ struct sock_server ts;
+ TEEC_Session session = { 0 };
+ uint32_t ret_orig;
+ uint32_t proto_error;
+ struct socket_handle sh;
+ uint8_t buf[64];
+ uint8_t buf2[64];
+ size_t blen;
+ struct test_200x_io_state server_iostate;
+ struct test_200x_io_state local_iostate;
+ struct sock_io_cb cb = {
+ .accept = test_200x_tcp_accept_cb,
+ .read = test_200x_tcp_read_cb,
+ .write = test_200x_tcp_write_cb,
+ .ptr = &server_iostate,
+ };
+
+ test_200x_init_io_state(&server_iostate, 1, 2);
+ test_200x_init_io_state(&local_iostate, 2, 1);
+
+ Do_ADBG_BeginSubCase(c, "Start server");
+ if (!ADBG_EXPECT_TRUE(c, sock_server_init_tcp(&ts, &cb)))
+ return;
+ Do_ADBG_EndSubCase(c, "Start server");
+
+ Do_ADBG_BeginSubCase(c, "TCP Socket open");
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(
+ &session, &socket_ta_uuid, NULL, &ret_orig)))
+ goto out;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_tcp_open(&session,
+ TEE_IP_VERSION_DC, ts.bind->host, ts.bind->port,
+ &sh, &proto_error, &ret_orig)))
+ goto out_close_session;
+
+ Do_ADBG_EndSubCase(c, "TCP Socket open");
+
+ Do_ADBG_BeginSubCase(c, "TCP Socket send");
+ blen = sizeof(buf);
+ rand_stream_read(local_iostate.write_rs, buf, blen);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_send(&session, &sh,
+ buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ goto out_close_session;
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
+ Do_ADBG_EndSubCase(c, "TCP Socket send");
+
+ Do_ADBG_BeginSubCase(c, "TCP Socket recv");
+ blen = sizeof(buf);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(&session, &sh,
+ buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ goto out_close_session;
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
+ rand_stream_read(local_iostate.read_rs, buf2, blen);
+ ADBG_EXPECT_BUFFER(c, buf2, blen, buf, blen);
+ Do_ADBG_EndSubCase(c, "TCP Socket recv");
+
+ /*
+ * All written bytes above (with the TA) is quite likely to have
+ * hit the tcp server by now.
+ */
+ ADBG_EXPECT_TRUE(c, !server_iostate.rfail);
+
+ Do_ADBG_BeginSubCase(c, "TCP Socket get error");
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_get_error(&session, &sh,
+ &proto_error, &ret_orig)))
+ goto out_close_session;
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, proto_error))
+ goto out_close_session;
+ Do_ADBG_EndSubCase(c, "TCP Socket get error");
+
+ Do_ADBG_BeginSubCase(c, "TCP Socket close");
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_close(&session, &sh,
+ &ret_orig)))
+ goto out_close_session;
+ Do_ADBG_EndSubCase(c, "TCP Socket close");
+
+ Do_ADBG_BeginSubCase(c, "TCP Socket ioctl");
+
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_tcp_open(&session,
+ TEE_IP_VERSION_DC, ts.bind->host, ts.bind->port,
+ &sh, &proto_error, &ret_orig)))
+ goto out_close_session;
+
+ blen = sizeof(buf);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_ioctl(&session, &sh, 0x00F00000,
+ buf, &blen, &ret_orig)))
+ goto out_close_session;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_close(&session, &sh,
+ &ret_orig)))
+ goto out_close_session;
+
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_tcp_open(&session,
+ TEE_IP_VERSION_DC, ts.bind->host, ts.bind->port,
+ &sh, &proto_error, &ret_orig)))
+ goto out_close_session;
+
+ blen = sizeof(buf);
+ ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
+ socket_ioctl(&session, &sh,
+ TEE_ISOCKET_PROTOCOLID_TCP << 24,
+ buf, &blen, &ret_orig));
+ TEEC_CloseSession(&session);
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(
+ &session, &socket_ta_uuid, NULL, &ret_orig)))
+ goto out;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_tcp_open(&session,
+ TEE_IP_VERSION_DC, ts.bind->host, ts.bind->port,
+ &sh, &proto_error, &ret_orig)))
+ goto out_close_session;
+
+ blen = sizeof(buf);
+ ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
+ socket_ioctl(&session, &sh, 0x32 << 24,
+ buf, &blen, &ret_orig));
+
+ Do_ADBG_EndSubCase(c, "TCP Socket ioctl");
+
+out_close_session:
+ TEEC_CloseSession(&session);
+out:
+ sock_server_uninit(&ts);
+}
+
+struct test_2002_barrier {
+ pthread_mutex_t mu;
+ pthread_barrier_t bar;
+};
+
+struct test_2002_arg {
+ bool success;
+ size_t tnum;
+ struct test_2002_barrier *bar;
+};
+
+static void xtest_2002_wait_barrier(struct test_2002_barrier *bar)
+{
+ /*
+ * Once the mutex is taken the barrier is initialized so the mutex
+ * can be released immediately.
+ */
+ xtest_mutex_lock(&bar->mu);
+ xtest_mutex_unlock(&bar->mu);
+ xtest_barrier_wait(&bar->bar);
+}
+
+static void *xtest_tee_test_2002_thread(void *arg)
+{
+ struct test_2002_arg *a = arg;
+ TEE_Result res;
+ struct sock_server ts;
+ TEEC_Session session = { 0 };
+ uint32_t ret_orig;
+ uint32_t proto_error;
+ struct socket_handle sh;
+ struct test_200x_io_state server_iostate;
+ struct test_200x_io_state local_iostate;
+ struct sock_io_cb cb = {
+ .accept = test_200x_tcp_accept_cb,
+ .read = test_200x_tcp_read_cb,
+ .write = test_200x_tcp_write_cb,
+ .ptr = &server_iostate,
+ };
+ int seed[2] = { 1 + a->tnum * 2, 2 + a->tnum * 2 };
+ size_t send_limit = 10000;
+ size_t recv_limit = 10000;
+ size_t sent_bytes = 0;
+ size_t recvd_bytes = 0;
+
+ test_200x_init_io_state(&server_iostate, seed[0], seed[1]);
+ test_200x_init_io_state(&local_iostate, seed[1], seed[0]);
+
+ if (!sock_server_init_tcp(&ts, &cb)) {
+ xtest_2002_wait_barrier(a->bar);
+ return NULL;
+ }
+
+ res = xtest_teec_open_session(&session, &socket_ta_uuid, NULL,
+ &ret_orig);
+
+ xtest_2002_wait_barrier(a->bar);
+ if (res != TEE_SUCCESS)
+ goto out;
+
+ res = socket_tcp_open(&session, TEE_IP_VERSION_DC, ts.bind->host,
+ ts.bind->port, &sh, &proto_error, &ret_orig);
+ if (res != TEE_SUCCESS)
+ goto out_close_session;
+
+ while (sent_bytes < send_limit && recvd_bytes < recv_limit) {
+ const void *peek;
+ uint8_t buf[64];
+ uint8_t buf2[64];
+ size_t blen;
+
+ blen = sizeof(buf);
+ peek = rand_stream_peek(local_iostate.write_rs, &blen);
+ res = socket_send(&session, &sh, peek, &blen,
+ TEE_TIMEOUT_INFINITE, &ret_orig);
+ if (res != TEE_SUCCESS)
+ goto out_close_session;
+ rand_stream_advance(local_iostate.write_rs, blen);
+ sent_bytes += blen;
+
+ blen = sizeof(buf);
+ res = socket_recv(&session, &sh, buf, &blen,
+ TEE_TIMEOUT_INFINITE, &ret_orig);
+ if (res != TEE_SUCCESS)
+ goto out_close_session;
+ rand_stream_read(local_iostate.read_rs, buf2, blen);
+ if (memcmp(buf2, buf, blen))
+ goto out_close_session;
+ recvd_bytes += blen;
+ }
+
+
+ res = socket_close(&session, &sh, &ret_orig);
+ if (res != TEE_SUCCESS)
+ goto out_close_session;
+
+ /*
+ * All written bytes above (with the TA) is quite likely to have
+ * hit the tcp server by now.
+ */
+ a->success = !server_iostate.rfail;
+
+out_close_session:
+ TEEC_CloseSession(&session);
+out:
+ sock_server_uninit(&ts);
+ return NULL;
+}
+
+#define NUM_THREADS 3
+
+static void xtest_tee_test_2002(ADBG_Case_t *c)
+{
+ pthread_t thr[NUM_THREADS];
+ struct test_2002_barrier bar = { .mu = PTHREAD_MUTEX_INITIALIZER };
+ struct test_2002_arg arg[NUM_THREADS];
+ size_t n;
+ size_t nt;
+
+ Do_ADBG_BeginSubCase(c, "Stressing with %d threads", NUM_THREADS);
+
+ xtest_mutex_lock(&bar.mu);
+
+ nt = NUM_THREADS;
+ for (n = 0; n < nt; n++) {
+ arg[n].success = false;
+ arg[n].tnum = n;
+ arg[n].bar = &bar;
+ if (!ADBG_EXPECT(c, 0, pthread_create(thr + n, NULL,
+ xtest_tee_test_2002_thread, arg + n)))
+ nt = n; /* break loop and start cleanup */
+ }
+
+ xtest_barrier_init(&bar.bar, nt + 1);
+ xtest_mutex_unlock(&bar.mu);
+ xtest_barrier_wait(&bar.bar);
+
+ for (n = 0; n < nt; n++) {
+ ADBG_EXPECT(c, 0, pthread_join(thr[n], NULL));
+ ADBG_EXPECT_TRUE(c, arg[n].success);
+ }
+
+ xtest_mutex_destroy(&bar.mu);
+ xtest_barrier_destroy(&bar.bar);
+
+ Do_ADBG_EndSubCase(c, "Stressing with %d threads", NUM_THREADS);
+}
+
+static bool test_2003_accept_cb(void *ptr, int fd, short *events)
+{
+ int val;
+
+ (void)ptr;
+ (void)events;
+
+ val = 4 * 1024;
+ if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &val, sizeof(val)))
+ warn("test_2003_accept_cb: setsockopt");
+ return true;
+}
+
+static void xtest_tee_test_2003(ADBG_Case_t *c)
+{
+ struct sock_server ts;
+ TEEC_Session session = { 0 };
+ uint32_t ret_orig;
+ uint32_t proto_error;
+ struct socket_handle sh;
+ void *buf;
+ const size_t blen0 = 16 * 1024;
+ size_t blen;
+ uint32_t val;
+ struct sock_io_cb cb = { .accept = test_2003_accept_cb };
+
+ Do_ADBG_BeginSubCase(c, "Start server");
+ if (!ADBG_EXPECT_TRUE(c, sock_server_init_tcp(&ts, &cb)))
+ return;
+ buf = calloc(1, blen0);
+ if (!ADBG_EXPECT_NOT_NULL(c, buf))
+ goto out;
+ Do_ADBG_EndSubCase(c, "Start server");
+
+ Do_ADBG_BeginSubCase(c, "TCP Socket open");
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(
+ &session, &socket_ta_uuid, NULL, &ret_orig)))
+ goto out;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_tcp_open(&session,
+ TEE_IP_VERSION_DC, ts.bind->host, ts.bind->port,
+ &sh, &proto_error, &ret_orig)))
+ goto out_close_session;
+
+ blen = sizeof(val);
+ val = 4 * 1024;
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_ioctl(&session, &sh,
+ TEE_TCP_SET_RECVBUF, &val, &blen, &ret_orig)))
+ goto out_close_session;
+
+ blen = sizeof(val);
+ val = 4 * 1024;
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_ioctl(&session, &sh,
+ TEE_TCP_SET_SENDBUF, &val, &blen, &ret_orig)))
+ goto out_close_session;
+
+ Do_ADBG_EndSubCase(c, "TCP Socket open");
+
+ Do_ADBG_BeginSubCase(c, "TCP Socket send (10 ms timeout)");
+ while (true) {
+ TEE_Result res;
+
+ blen = blen0;
+ memset(buf, 0, blen0);
+ res = socket_send(&session, &sh, buf, &blen, 10, &ret_orig);
+ if (res == TEE_ISOCKET_ERROR_TIMEOUT)
+ break;
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
+ goto out_close_session;
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, blen0);
+ }
+ Do_ADBG_EndSubCase(c, "TCP Socket send (10 ms timeout)");
+
+ Do_ADBG_BeginSubCase(c, "TCP Socket recv (10 ms timeout)");
+ blen = blen0;
+ ADBG_EXPECT_TEEC_RESULT(c, TEE_ISOCKET_ERROR_TIMEOUT,
+ socket_recv(&session, &sh, buf, &blen,
+ 10, &ret_orig));
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, blen0);
+ Do_ADBG_EndSubCase(c, "TCP Socket recv (10 ms timeout)");
+
+ Do_ADBG_BeginSubCase(c, "TCP Socket get error");
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_get_error(&session, &sh,
+ &proto_error, &ret_orig)))
+ goto out_close_session;
+ ADBG_EXPECT_TEEC_RESULT(c, TEE_ISOCKET_ERROR_TIMEOUT, proto_error);
+ Do_ADBG_EndSubCase(c, "TCP Socket get error");
+
+out_close_session:
+ TEEC_CloseSession(&session);
+out:
+ free(buf);
+ sock_server_uninit(&ts);
+}
+
+static bool test_200x_udp_accept_cb(void *ptr, int fd, short *events)
+{
+ struct test_200x_io_state *iostate = ptr;
+ struct sockaddr_storage sass;
+ struct sockaddr *sa = (struct sockaddr *)&sass;
+ socklen_t slen = sizeof(sass);
+ uint8_t buf[100];
+ uint8_t buf2[100];
+ ssize_t r;
+ size_t l;
+
+ (void)events;
+
+ r = recvfrom(fd, buf, sizeof(buf), 0, sa, &slen);
+ if (r == -1)
+ return false;
+
+ l = r;
+ rand_stream_read(iostate->read_rs, buf2, l);
+ if (memcmp(buf, buf2, l))
+ iostate->rfail = true;
+
+ rand_stream_read(iostate->write_rs, buf, l);
+ return sendto(fd, buf, l, 0, sa, slen) != -1;
+}
+
+static void xtest_tee_test_2004(ADBG_Case_t *c)
+{
+ struct sock_server ts;
+ struct sock_server ts2;
+ struct sock_server ts3;
+ bool ts_inited = false;
+ bool ts2_inited = false;
+ bool ts3_inited = false;
+ TEEC_Session session = { 0 };
+ uint32_t ret_orig;
+ uint32_t proto_error;
+ struct socket_handle sh;
+ uint8_t buf[64];
+ uint8_t buf2[64];
+ size_t blen;
+ uint16_t port;
+ struct test_200x_io_state server_iostate;
+ struct test_200x_io_state local_iostate;
+ struct sock_io_cb cb = {
+ .accept = test_200x_udp_accept_cb,
+ .ptr = &server_iostate,
+ };
+
+ test_200x_init_io_state(&server_iostate, 1, 2);
+ test_200x_init_io_state(&local_iostate, 2, 1);
+
+ Do_ADBG_BeginSubCase(c, "Start server");
+ if (!ADBG_EXPECT_TRUE(c, sock_server_init_udp(&ts, &cb)))
+ return;
+ ts_inited = true;
+ if (!ADBG_EXPECT_TRUE(c, sock_server_init_udp(&ts2, &cb)))
+ goto out;
+ ts2_inited = true;
+ if (!ADBG_EXPECT_TRUE(c, sock_server_init_udp(&ts3, &cb)))
+ goto out;
+ ts3_inited = true;
+ Do_ADBG_EndSubCase(c, "Start server");
+
+ Do_ADBG_BeginSubCase(c, "UDP Socket open");
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(
+ &session, &socket_ta_uuid, NULL, &ret_orig)))
+ goto out;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_udp_open(&session,
+ TEE_IP_VERSION_DC, ts.bind->host, ts.bind->port,
+ &sh, &proto_error, &ret_orig)))
+ goto out_close_session;
+
+ Do_ADBG_EndSubCase(c, "UDP Socket open");
+
+ Do_ADBG_BeginSubCase(c, "UDP Socket send");
+ blen = sizeof(buf);
+ rand_stream_read(local_iostate.write_rs, buf, blen);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_send(&session, &sh,
+ buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ goto out_close_session;
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
+ Do_ADBG_EndSubCase(c, "UDP Socket send");
+
+ Do_ADBG_BeginSubCase(c, "UDP Socket recv");
+ blen = sizeof(buf);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(&session, &sh,
+ buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ goto out_close_session;
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
+ rand_stream_read(local_iostate.read_rs, buf2, blen);
+ ADBG_EXPECT_BUFFER(c, buf2, blen, buf, blen);
+ ADBG_EXPECT_TRUE(c, !server_iostate.rfail);
+ Do_ADBG_EndSubCase(c, "UDP Socket recv");
+
+ Do_ADBG_BeginSubCase(c, "UDP Socket get error");
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_get_error(&session, &sh,
+ &proto_error, &ret_orig)))
+ goto out_close_session;
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, proto_error))
+ goto out_close_session;
+ Do_ADBG_EndSubCase(c, "UDP Socket get error");
+
+ Do_ADBG_BeginSubCase(c, "UDP Socket close");
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_close(&session, &sh,
+ &ret_orig)))
+ goto out_close_session;
+ Do_ADBG_EndSubCase(c, "UDP Socket close");
+
+ Do_ADBG_BeginSubCase(c, "UDP Socket ioctl");
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_udp_open(&session,
+ TEE_IP_VERSION_DC, ts.bind->host, ts.bind->port,
+ &sh, &proto_error, &ret_orig)))
+ goto out_close_session;
+
+ blen = sizeof(buf);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_ioctl(&session, &sh, 0x00F00000,
+ buf, &blen, &ret_orig)))
+ goto out_close_session;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_close(&session, &sh,
+ &ret_orig)))
+ goto out_close_session;
+
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_udp_open(&session,
+ TEE_IP_VERSION_DC, ts.bind->host, ts.bind->port,
+ &sh, &proto_error, &ret_orig)))
+ goto out_close_session;
+
+ blen = sizeof(buf);
+ ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
+ socket_ioctl(&session, &sh,
+ TEE_ISOCKET_PROTOCOLID_UDP << 24,
+ buf, &blen, &ret_orig));
+ TEEC_CloseSession(&session);
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(
+ &session, &socket_ta_uuid, NULL, &ret_orig)))
+ goto out;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_udp_open(&session,
+ TEE_IP_VERSION_DC, ts.bind->host, ts.bind->port,
+ &sh, &proto_error, &ret_orig)))
+ goto out_close_session;
+
+ blen = sizeof(buf);
+ ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
+ socket_ioctl(&session, &sh, 0x32 << 24,
+ buf, &blen, &ret_orig));
+
+ Do_ADBG_EndSubCase(c, "UDP Socket ioctl");
+
+ Do_ADBG_BeginSubCase(c, "UDP Socket change port");
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(
+ &session, &socket_ta_uuid, NULL, &ret_orig)))
+ goto out;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_udp_open(&session,
+ TEE_IP_VERSION_DC, ts.bind->host, ts.bind->port,
+ &sh, &proto_error, &ret_orig)))
+ goto out_close_session;
+ sock_server_uninit(&ts);
+ ts_inited = false;
+
+ port = ts2.bind->port;
+ blen = sizeof(port);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_ioctl(&session, &sh,
+ TEE_UDP_CHANGEPORT, &port, &blen, &ret_orig)))
+ goto out_close_session;
+
+ Do_ADBG_BeginSubCase(c, "UDP Socket send");
+ blen = sizeof(buf);
+ rand_stream_read(local_iostate.write_rs, buf, blen);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_send(&session, &sh,
+ buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ goto out_close_session;
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
+ Do_ADBG_EndSubCase(c, "UDP Socket send");
+
+ Do_ADBG_BeginSubCase(c, "UDP Socket recv");
+ blen = sizeof(buf);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(&session, &sh,
+ buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ goto out_close_session;
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
+ rand_stream_read(local_iostate.read_rs, buf2, blen);
+ ADBG_EXPECT_BUFFER(c, buf2, blen, buf, blen);
+ ADBG_EXPECT_TRUE(c, !server_iostate.rfail);
+ Do_ADBG_EndSubCase(c, "UDP Socket recv");
+
+ Do_ADBG_EndSubCase(c, "UDP Socket change port");
+
+ Do_ADBG_BeginSubCase(c, "UDP Socket change addr");
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(
+ &session, &socket_ta_uuid, NULL, &ret_orig)))
+ goto out;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_udp_open(&session,
+ TEE_IP_VERSION_DC, ts2.bind->host, ts2.bind->port,
+ &sh, &proto_error, &ret_orig)))
+ goto out_close_session;
+ sock_server_uninit(&ts2);
+ ts2_inited = false;
+
+ port = ts3.bind->port;
+ blen = sizeof(port);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_ioctl(&session, &sh,
+ TEE_UDP_CHANGEPORT, &port, &blen, &ret_orig)))
+ goto out_close_session;
+
+ blen = strlen(ts3.bind->host) + 1;
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_ioctl(&session, &sh,
+ TEE_UDP_CHANGEADDR, ts3.bind->host, &blen, &ret_orig)))
+ goto out_close_session;
+
+ Do_ADBG_BeginSubCase(c, "UDP Socket send");
+ blen = sizeof(buf);
+ rand_stream_read(local_iostate.write_rs, buf, blen);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_send(&session, &sh,
+ buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ goto out_close_session;
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
+ Do_ADBG_EndSubCase(c, "UDP Socket send");
+
+ Do_ADBG_BeginSubCase(c, "UDP Socket recv");
+ blen = sizeof(buf);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, socket_recv(&session, &sh,
+ buf, &blen, TEE_TIMEOUT_INFINITE, &ret_orig)))
+ goto out_close_session;
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==, sizeof(buf));
+ rand_stream_read(local_iostate.read_rs, buf2, blen);
+ ADBG_EXPECT_BUFFER(c, buf2, blen, buf, blen);
+ ADBG_EXPECT_TRUE(c, !server_iostate.rfail);
+ Do_ADBG_EndSubCase(c, "UDP Socket recv");
+
+ Do_ADBG_EndSubCase(c, "UDP Socket change addr");
+
+
+out_close_session:
+ TEEC_CloseSession(&session);
+out:
+ if (ts_inited)
+ sock_server_uninit(&ts);
+ if (ts2_inited)
+ sock_server_uninit(&ts2);
+ if (ts3_inited)
+ sock_server_uninit(&ts3);
+}
+
+
+
+ADBG_CASE_DEFINE(regression, 2001, xtest_tee_test_2001,
+ "Trivial TCP iSocket API tests");
+
+ADBG_CASE_DEFINE(regression, 2002, xtest_tee_test_2002,
+ "Concurrent stressing TCP iSocket API tests");
+
+ADBG_CASE_DEFINE(regression, 2003, xtest_tee_test_2003,
+ "Timeout TCP iSocket API tests");
+
+ADBG_CASE_DEFINE(regression, 2004, xtest_tee_test_2004,
+ "UDP iSocket API tests");
diff --git a/demos/optee_test/host/xtest/xtest_4000.c b/demos/optee_test/host/xtest/regression_4000.c
index 611fea7..59f8deb 100644
--- a/demos/optee_test/host/xtest/xtest_4000.c
+++ b/demos/optee_test/host/xtest/regression_4000.c
@@ -24,7 +24,7 @@
#include <utee_defines.h>
#include <util.h>
-#include <xtest_4000_data.h>
+#include <regression_4000_data.h>
#include <nist/186-2ecdsatestvectors.h>
#include <assert.h>
@@ -42,29 +42,29 @@ static void xtest_tee_test_4009(ADBG_Case_t *Case_p);
static void xtest_tee_test_4010(ADBG_Case_t *Case_p);
static void xtest_tee_test_4011(ADBG_Case_t *Case_p);
-ADBG_CASE_DEFINE(XTEST_TEE_4001, xtest_tee_test_4001,
+ADBG_CASE_DEFINE(regression, 4001, xtest_tee_test_4001,
"Test TEE Internal API hash operations");
-ADBG_CASE_DEFINE(XTEST_TEE_4002, xtest_tee_test_4002,
+ADBG_CASE_DEFINE(regression, 4002, xtest_tee_test_4002,
"Test TEE Internal API MAC operations");
-ADBG_CASE_DEFINE(XTEST_TEE_4003_NO_XTS, xtest_tee_test_4003_no_xts,
+ADBG_CASE_DEFINE(regression, 4003_NO_XTS, xtest_tee_test_4003_no_xts,
"Test TEE Internal API cipher operations without AES XTS");
-ADBG_CASE_DEFINE(XTEST_TEE_4003_XTS, xtest_tee_test_4003_xts,
+ADBG_CASE_DEFINE(regression, 4003_XTS, xtest_tee_test_4003_xts,
"Test TEE Internal API cipher operations for AES XTS");
-ADBG_CASE_DEFINE(XTEST_TEE_4004, xtest_tee_test_4004,
+ADBG_CASE_DEFINE(regression, 4004, xtest_tee_test_4004,
"Test TEE Internal API get random");
-ADBG_CASE_DEFINE(XTEST_TEE_4005, xtest_tee_test_4005,
+ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
"Test TEE Internal API Authenticated Encryption operations");
-ADBG_CASE_DEFINE(XTEST_TEE_4006, xtest_tee_test_4006,
+ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
"Test TEE Internal API Asymmetric Cipher operations");
-ADBG_CASE_DEFINE(XTEST_TEE_4007, xtest_tee_test_4007,
+ADBG_CASE_DEFINE(regression, 4007, xtest_tee_test_4007,
"Test TEE Internal API Generate key");
-ADBG_CASE_DEFINE(XTEST_TEE_4008, xtest_tee_test_4008,
+ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
"Test TEE Internal API Derive key");
-ADBG_CASE_DEFINE(XTEST_TEE_4009, xtest_tee_test_4009,
+ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
"Test TEE Internal API Derive key ECDH");
-ADBG_CASE_DEFINE(XTEST_TEE_4010, xtest_tee_test_4010,
+ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
"Test TEE Internal API create transient object (negative)");
-ADBG_CASE_DEFINE(XTEST_TEE_4011, xtest_tee_test_4011,
+ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
"Test TEE Internal API Bleichenbacher attack (negative)");
static TEEC_Result ta_crypt_cmd_random_number_generate(ADBG_Case_t *c,
@@ -2000,6 +2000,50 @@ static const uint8_t ciph_data_aes_cts_vect6_ctx[] = {
0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
};
+/*
+ * Test case for https://github.com/OP-TEE/optee_os/issues/1203
+ * 80 bytes of data, processed in two steps (32 + 48).
+ */
+
+#define ciph_data_aes_cts_issue1203_key ciph_data_aes_cts_vect1_key
+
+static const uint8_t ciph_data_aes_cts_issue1203_iv[] = {
+ 0x5b, 0x11, 0x7b, 0xf9, 0x83, 0x6a, 0x01, 0x27,
+ 0x1d, 0x2a, 0xae, 0x0a, 0xd3, 0x27, 0x35, 0x81,
+};
+
+static const uint8_t ciph_data_aes_cts_issue1203_ptx[] = {
+ 0x33, 0x2a, 0xf4, 0x8c, 0x18, 0xa1, 0x30, 0x7c,
+ 0xa7, 0x52, 0x76, 0xca, 0xa6, 0x68, 0xad, 0xf6,
+ 0x1e, 0xba, 0xc9, 0x66, 0x66, 0x52, 0x1a, 0xe7,
+ 0x3e, 0xbc, 0xba, 0x60, 0x95, 0x71, 0x04, 0x5e,
+ 0xb4, 0xb7, 0x10, 0xd7, 0x93, 0x6d, 0x5f, 0x9a,
+ 0xb8, 0xbb, 0x6b, 0xb0, 0x6d, 0x47, 0x93, 0x41,
+ 0x29, 0x21, 0xf2, 0x84, 0xf5, 0xb2, 0xf2, 0x6d,
+ 0xbe, 0xe5, 0x8a, 0x2b, 0x58, 0x8d, 0x1b, 0x5e,
+ 0x41, 0x04, 0xba, 0x9e, 0x92, 0xe9, 0x52, 0xb6,
+ 0x8b, 0x1e, 0x36, 0x72, 0x91, 0xe4, 0x56, 0x66,
+};
+
+/*
+ * Ciphertext was generated by an online tool for AES CBC.
+ * Since the input size is a multiple of the block size, and the ciphertext
+ * format is CS3, the output is the same as plain AES CBC with the last
+ * two blocks swapped.
+ */
+static const uint8_t ciph_data_aes_cts_issue1203_ctx[] = {
+ 0x6c, 0xfe, 0xef, 0x6a, 0x1c, 0x8f, 0xd3, 0xc3,
+ 0x66, 0xc4, 0xd9, 0x0e, 0xbe, 0x24, 0x17, 0x3f,
+ 0xcd, 0x19, 0xc9, 0xd2, 0x10, 0x3f, 0xcf, 0xdc,
+ 0xe9, 0x05, 0xab, 0xd5, 0x1a, 0x31, 0x41, 0x77,
+ 0x3b, 0xd7, 0x6a, 0x26, 0xae, 0x0d, 0xc9, 0x47,
+ 0x77, 0xd4, 0xa7, 0xd5, 0x73, 0x88, 0x9e, 0xde,
+ 0x72, 0x66, 0xe0, 0xe2, 0x3d, 0x62, 0x91, 0x22,
+ 0xae, 0x11, 0x01, 0x97, 0x22, 0x6a, 0x45, 0xa9,
+ 0xba, 0x56, 0xd2, 0xbc, 0x55, 0x2d, 0x99, 0x4d,
+ 0x3d, 0x22, 0x27, 0x9a, 0xac, 0x66, 0x2f, 0xf5,
+};
+
static const uint8_t ciph_data_des_ecb_nopad_out1[] = {
0x46, 0x2B, 0x91, 0xA8, 0x55, 0xE6, 0x7E, 0x75, /* F+..U.~u */
0x5E, 0x53, 0xF4, 0x8F, 0x29, 0x41, 0x4E, 0xEF, /* ^S..)AN. */
@@ -2161,6 +2205,7 @@ static const struct xtest_ciph_case ciph_cases[] = {
XTEST_CIPH_CASE_AES_CTS(vect5, 7),
XTEST_CIPH_CASE_AES_CTS(vect6, 17),
XTEST_CIPH_CASE_AES_CTS(vect6, 0x20),
+ XTEST_CIPH_CASE_AES_CTS(issue1203, 32),
/* DES */
XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
diff --git a/demos/optee_test/host/xtest/xtest_4000_data.h b/demos/optee_test/host/xtest/regression_4000_data.h
index 288aab6..288aab6 100644
--- a/demos/optee_test/host/xtest/xtest_4000_data.h
+++ b/demos/optee_test/host/xtest/regression_4000_data.h
diff --git a/demos/optee_test/host/xtest/xtest_5000.c b/demos/optee_test/host/xtest/regression_5000.c
index 448ee16..64c35f0 100644
--- a/demos/optee_test/host/xtest/xtest_5000.c
+++ b/demos/optee_test/host/xtest/regression_5000.c
@@ -637,5 +637,5 @@ static void xtest_teec_TEE(ADBG_Case_t *c)
Register_sharedMemory_belowMaxSize(&connection);
}
-ADBG_CASE_DEFINE(XTEST_TEE_5006, xtest_teec_TEE,
+ADBG_CASE_DEFINE(regression, 5006, xtest_teec_TEE,
"Tests for Global platform TEEC");
diff --git a/demos/optee_test/host/xtest/xtest_6000.c b/demos/optee_test/host/xtest/regression_6000.c
index c412f25..a9ebf29 100644
--- a/demos/optee_test/host/xtest/xtest_6000.c
+++ b/demos/optee_test/host/xtest/regression_6000.c
@@ -79,6 +79,29 @@ static uint8_t data_01[] = {
0x01, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x01
};
+static uint32_t fs_id_for_tee_storage_private(void)
+{
+#if defined(CFG_REE_FS)
+ return TEE_STORAGE_PRIVATE_REE;
+#elif defined(CFG_RPMB_FS)
+ return TEE_STORAGE_PRIVATE_RPMB;
+#elif defined(CFG_SQL_FS)
+ return TEE_STORAGE_PRIVATE_SQL;
+#endif
+}
+
+static uint32_t real_id_for(uint32_t id)
+{
+ if (id == TEE_STORAGE_PRIVATE)
+ return fs_id_for_tee_storage_private();
+ return id;
+}
+
+static bool storage_is(uint32_t id1, uint32_t id2)
+{
+ return (real_id_for(id1) == real_id_for(id2));
+}
+
static TEEC_Result fs_open(TEEC_Session *sess, void *id, uint32_t id_size,
uint32_t flags, uint32_t *obj, uint32_t storage_id)
{
@@ -286,6 +309,21 @@ static TEEC_Result fs_alloc_enum(TEEC_Session *sess, uint32_t *e)
return res;
}
+static TEEC_Result fs_reset_enum(TEEC_Session *sess, uint32_t e)
+{
+ TEEC_Result res;
+ TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
+ uint32_t org;
+
+ op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
+ TEEC_NONE, TEEC_NONE);
+
+ op.params[0].value.a = e;
+ res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_ENUM, &op, &org);
+
+ return res;
+}
+
static TEEC_Result fs_free_enum(TEEC_Session *sess, uint32_t e)
{
TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
@@ -1288,6 +1326,14 @@ seek_write_read_out:
Do_ADBG_EndSubCase(c, "Rename Access Conflict");
+ Do_ADBG_BeginSubCase(c, "AllocPersistentObjectEnumerator + "
+ "ResetPersistentObjectEnumerator");
+ e = TEE_HANDLE_NULL;
+ ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
+ ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_enum(&sess, e));
+ Do_ADBG_EndSubCase(c, "AllocPersistentObjectEnumerator + "
+ "ResetPersistentObjectEnumerator");
+
Do_ADBG_BeginSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
e = TEE_HANDLE_NULL;
ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
@@ -1723,38 +1769,130 @@ exit:
DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6017)
-ADBG_CASE_DEFINE(XTEST_TEE_6001, xtest_tee_test_6001,
+static void xtest_tee_test_6018_single(ADBG_Case_t *c, uint32_t storage_id)
+{
+ TEEC_Session sess;
+ TEE_ObjectInfo obj_info1;
+ TEE_ObjectInfo obj_info2;
+ uint32_t obj;
+ uint32_t orig;
+ uint8_t block[32 * 1024];
+ size_t num_blocks;
+ size_t block_size;
+ size_t n;
+
+ if (storage_is(storage_id, TEE_STORAGE_PRIVATE_RPMB)) {
+ /* RPMB FS is a bit resource constrained */
+ num_blocks = 20;
+ block_size = 1024;
+ } else {
+ num_blocks = 40;
+ block_size = sizeof(block);
+ }
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+ xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
+ return;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+ fs_create(&sess, file_01, sizeof(file_01),
+ TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
+ 0, &obj, storage_id)))
+ goto exit;
+
+ for (n = 0; n < num_blocks; n++) {
+ memset(block, n, block_size);
+
+ Do_ADBG_Log("writing %zu", n);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+ fs_write(&sess, obj, block, block_size)))
+ goto exit;
+ }
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+ fs_get_obj_info(&sess, obj, &obj_info1,
+ sizeof(TEE_ObjectInfo))))
+ goto exit;
+
+ if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
+ obj_info1.dataSize, ==, block_size * num_blocks))
+ goto exit;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
+ goto exit;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+ fs_open(&sess, file_01, sizeof(file_01),
+ TEE_DATA_FLAG_ACCESS_READ |
+ TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
+ goto exit;
+
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+ fs_get_obj_info(&sess, obj, &obj_info2,
+ sizeof(TEE_ObjectInfo))))
+ goto exit;
+
+ if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
+ obj_info1.dataSize, ==, obj_info2.dataSize))
+ goto exit;
+
+ for (n = 0; n < num_blocks; n++) {
+ uint8_t br[block_size];
+ uint32_t count;
+
+ memset(block, n, block_size);
+
+ Do_ADBG_Log("reading %zu", n);
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+ fs_read(&sess, obj, br, sizeof(br), &count)))
+ goto exit;
+ if (!ADBG_EXPECT_BUFFER(c, block, block_size, br, count))
+ goto exit;
+ }
+
+ /* clean */
+ if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
+ goto exit;
+
+exit:
+ TEEC_CloseSession(&sess);
+}
+
+DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6018)
+
+ADBG_CASE_DEFINE(regression, 6001, xtest_tee_test_6001,
"Test TEE_CreatePersistentObject");
-ADBG_CASE_DEFINE(XTEST_TEE_6002, xtest_tee_test_6002,
+ADBG_CASE_DEFINE(regression, 6002, xtest_tee_test_6002,
"Test TEE_OpenPersistentObject");
-ADBG_CASE_DEFINE(XTEST_TEE_6003, xtest_tee_test_6003,
+ADBG_CASE_DEFINE(regression, 6003, xtest_tee_test_6003,
"Test TEE_ReadObjectData");
-ADBG_CASE_DEFINE(XTEST_TEE_6004, xtest_tee_test_6004,
+ADBG_CASE_DEFINE(regression, 6004, xtest_tee_test_6004,
"Test TEE_WriteObjectData");
-ADBG_CASE_DEFINE(XTEST_TEE_6005, xtest_tee_test_6005,
+ADBG_CASE_DEFINE(regression, 6005, xtest_tee_test_6005,
"Test TEE_SeekObjectData");
-ADBG_CASE_DEFINE(XTEST_TEE_6006, xtest_tee_test_6006,
+ADBG_CASE_DEFINE(regression, 6006, xtest_tee_test_6006,
"Test TEE_CloseAndDeletePersistentObject");
-ADBG_CASE_DEFINE(XTEST_TEE_6007, xtest_tee_test_6007,
+ADBG_CASE_DEFINE(regression, 6007, xtest_tee_test_6007,
"Test TEE_TruncateObjectData");
-ADBG_CASE_DEFINE(XTEST_TEE_6008, xtest_tee_test_6008,
+ADBG_CASE_DEFINE(regression, 6008, xtest_tee_test_6008,
"Test TEE_RenamePersistentObject");
-ADBG_CASE_DEFINE(XTEST_TEE_6009, xtest_tee_test_6009,
+ADBG_CASE_DEFINE(regression, 6009, xtest_tee_test_6009,
"Test TEE Internal API Persistent Object Enumeration Functions");
-ADBG_CASE_DEFINE(XTEST_TEE_6010, xtest_tee_test_6010, "Test Storage");
+ADBG_CASE_DEFINE(regression, 6010, xtest_tee_test_6010, "Test Storage");
#ifdef WITH_GP_TESTS
-ADBG_CASE_DEFINE(XTEST_TEE_6011, xtest_tee_test_6011,
- "Test TEE GP TTA DS init objects");
+ADBG_CASE_DEFINE(regression, 6011, xtest_tee_test_6011,
+ "Test TEE GP TTA DS init objects");
#endif
-ADBG_CASE_DEFINE(XTEST_TEE_6012, xtest_tee_test_6012,
+ADBG_CASE_DEFINE(regression, 6012, xtest_tee_test_6012,
"Test TEE GP TTA DS init objects");
-ADBG_CASE_DEFINE(XTEST_TEE_6013, xtest_tee_test_6013,
+ADBG_CASE_DEFINE(regression, 6013, xtest_tee_test_6013,
"Key usage in Persistent objects");
-ADBG_CASE_DEFINE(XTEST_TEE_6014, xtest_tee_test_6014,
+ADBG_CASE_DEFINE(regression, 6014, xtest_tee_test_6014,
"Loop on Persistent objects");
-ADBG_CASE_DEFINE(XTEST_TEE_6015, xtest_tee_test_6015, "Storage isolation");
-ADBG_CASE_DEFINE(XTEST_TEE_6016, xtest_tee_test_6016, "Storage concurency");
-ADBG_CASE_DEFINE(XTEST_TEE_6017, xtest_tee_test_6017,
+ADBG_CASE_DEFINE(regression, 6015, xtest_tee_test_6015, "Storage isolation");
+ADBG_CASE_DEFINE(regression, 6016, xtest_tee_test_6016, "Storage concurency");
+ADBG_CASE_DEFINE(regression, 6017, xtest_tee_test_6017,
"Test Persistent objects info");
+ADBG_CASE_DEFINE(regression, 6018, xtest_tee_test_6018, "Large object");
diff --git a/demos/optee_test/host/xtest/xtest_7000.c b/demos/optee_test/host/xtest/regression_7000.c
index 090ea3e..989187f 100644
--- a/demos/optee_test/host/xtest/xtest_7000.c
+++ b/demos/optee_test/host/xtest/regression_7000.c
@@ -226,34 +226,6 @@ static void xtest_tee_7010(ADBG_Case_t *c)
TEEC_FinalizeContext(CONTEXT01);
}
-/*29-f0-9c*/
-static void xtest_tee_7011(ADBG_Case_t *c)
-{
- if (!ADBG_EXPECT_TRUE(c, xtest_tee_init(c)))
- return;
- TEEC_SelectApp(CLIENT_APP01, THREAD01_DEFAULT);
- XML_InitializeContext(c, _device, CONTEXT01, TEEC_SUCCESS);
- XML_OpenSession(c, CONTEXT01, SESSION01,
- &UUID_TTA_answerSuccessTo_OpenSession_Invoke,
- TEEC_LOGIN_PUBLIC, NULL, NULL, 0, TEEC_SUCCESS);
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-}
-
-/*29-4d-b0*/
-static void xtest_tee_7012(ADBG_Case_t *c)
-{
- if (!ADBG_EXPECT_TRUE(c, xtest_tee_init(c)))
- return;
- TEEC_SelectApp(CLIENT_APP01, THREAD01_DEFAULT);
- XML_InitializeContext(c, _device, CONTEXT01, TEEC_SUCCESS);
- XML_OpenSession(c, CONTEXT01, SESSION01,
- &UUID_TTA_answerErrorTo_OpenSession, TEEC_LOGIN_PUBLIC,
- NULL, NULL, TEEC_ORIGIN_TRUSTED_APP,
- TEEC_ERROR_GENERIC);
- TEEC_FinalizeContext(CONTEXT01);
-}
-
/*29-a2-e3*/
static void xtest_tee_7013(ADBG_Case_t *c)
{
@@ -268,49 +240,6 @@ static void xtest_tee_7013(ADBG_Case_t *c)
TEEC_FinalizeContext(CONTEXT01);
}
-/*29-5d-d8*/
-static void xtest_tee_7014(ADBG_Case_t *c)
-{
- if (!ADBG_EXPECT_TRUE(c, xtest_tee_init(c)))
- return;
- TEEC_SelectApp(CLIENT_APP01, THREAD01_DEFAULT);
- XML_InitializeContext(c, _device, CONTEXT01, TEEC_SUCCESS);
- OPERATION_TEEC_PARAM_TYPES(OPERATION01, TEEC_VALUE_INPUT,
- TEEC_VALUE_INPUT, TEEC_VALUE_INPUT,
- TEEC_VALUE_INPUT);
-
- TEEC_prepare_OperationEachParameter_value(OPERATION01, 0, VALUE01,
- IGNORE);
- TEEC_prepare_OperationEachParameter_value(OPERATION01, 1, IGNORE,
- VALUE01);
- TEEC_prepare_OperationEachParameter_value(OPERATION01, 2, VALUE01,
- VALUE01);
- TEEC_prepare_OperationEachParameter_value(OPERATION01, 3, VALUE01,
- VALUE02);
-
- XML_OpenSession(c, CONTEXT01, SESSION01,
- &UUID_TTA_check_OpenSession_with_4_parameters,
- TEEC_LOGIN_PUBLIC, NULL, OPERATION01, 0,
- TEEC_SUCCESS);
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-}
-
-/*29-82-81*/
-static void xtest_tee_7015(ADBG_Case_t *c)
-{
- if (!ADBG_EXPECT_TRUE(c, xtest_tee_init(c)))
- return;
- TEEC_SelectApp(CLIENT_APP01, THREAD01_DEFAULT);
- XML_InitializeContext(c, _device, CONTEXT01, TEEC_SUCCESS);
- XML_OpenSession(c, CONTEXT01, SESSION01,
- &UUID_TTA_answerSuccessTo_OpenSession_Invoke,
- TEEC_LOGIN_PUBLIC, NULL, NULL, TEEC_ORIGIN_TRUSTED_APP,
- TEEC_SUCCESS);
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-}
-
/*29-db-48*/
static void xtest_tee_7016(ADBG_Case_t *c)
{
@@ -355,41 +284,33 @@ static void xtest_tee_7019(ADBG_Case_t *c)
TEEC_FinalizeContext(CONTEXT01);
}
-ADBG_CASE_DEFINE(XTEST_TEE_7001, xtest_tee_7001,
+ADBG_CASE_DEFINE(regression, 7001, xtest_tee_7001,
"Allocate_In RELEASE_SHARED_MEMORY_WHEN_ALLOCATED");
-ADBG_CASE_DEFINE(XTEST_TEE_7002, xtest_tee_7002,
+ADBG_CASE_DEFINE(regression, 7002, xtest_tee_7002,
"Allocate_out_of_memory INITIALIZE_CONTEXT_NAMES");
-ADBG_CASE_DEFINE(XTEST_TEE_7003, xtest_tee_7003,
+ADBG_CASE_DEFINE(regression, 7003, xtest_tee_7003,
"ReleaseSharedMemory_null RELEASE_SHARED_MEMORY_WHEN_ALLOCATED");
-ADBG_CASE_DEFINE(XTEST_TEE_7004, xtest_tee_7004,
+ADBG_CASE_DEFINE(regression, 7004, xtest_tee_7004,
"Allocate_InOut RELEASE_SHARED_MEMORY_WHEN_ALLOCATED");
-ADBG_CASE_DEFINE(XTEST_TEE_7005, xtest_tee_7005,
+ADBG_CASE_DEFINE(regression, 7005, xtest_tee_7005,
"Register_In RELEASE_SHARED_MEMORY_WHEN_REGISTERED");
-ADBG_CASE_DEFINE(XTEST_TEE_7006, xtest_tee_7006,
+ADBG_CASE_DEFINE(regression, 7006, xtest_tee_7006,
"Register_notZeroLength_Out RELEASE_SHARED_MEMORY_WHEN_REGISTERED");
-ADBG_CASE_DEFINE(XTEST_TEE_7007, xtest_tee_7007,
+ADBG_CASE_DEFINE(regression, 7007, xtest_tee_7007,
"Register_InOut RELEASE_SHARED_MEMORY_WHEN_REGISTERED");
-ADBG_CASE_DEFINE(XTEST_TEE_7008, xtest_tee_7008,
+ADBG_CASE_DEFINE(regression, 7008, xtest_tee_7008,
"Register_zeroLength_Out RELEASE_SHARED_MEMORY_WHEN_REGISTERED");
-ADBG_CASE_DEFINE(XTEST_TEE_7009, xtest_tee_7009,
+ADBG_CASE_DEFINE(regression, 7009, xtest_tee_7009,
"OpenSession_error_notExistingTA OPEN_SESSION_TARGET_TRUSTED_APP");
-ADBG_CASE_DEFINE(XTEST_TEE_7010, xtest_tee_7010,
+ADBG_CASE_DEFINE(regression, 7010, xtest_tee_7010,
"Allocate_Out RELEASE_SHARED_MEMORY_WHEN_ALLOCATED");
-ADBG_CASE_DEFINE(XTEST_TEE_7011, xtest_tee_7011,
- "OpenSession_success_nullReturnOrigin OPEN_SESSION_TARGET_TRUSTED_APP");
-ADBG_CASE_DEFINE(XTEST_TEE_7012, xtest_tee_7012,
- "OpenSession_error_originTrustedApp OPEN_SESSION_TARGET_TRUSTED_APP");
-ADBG_CASE_DEFINE(XTEST_TEE_7013, xtest_tee_7013,
+ADBG_CASE_DEFINE(regression, 7013, xtest_tee_7013,
"OpenSession_error_originTEE OPEN_SESSION_TARGET_TRUSTED_APP");
-ADBG_CASE_DEFINE(XTEST_TEE_7014, xtest_tee_7014,
- "OpenSession_with_operation_parameters OPEN_SESSION_TARGET_TRUSTED_APP");
-ADBG_CASE_DEFINE(XTEST_TEE_7015, xtest_tee_7015,
- "OpenSession_success_originTrustedApp OPEN_SESSION_TARGET_TRUSTED_APP");
-ADBG_CASE_DEFINE(XTEST_TEE_7016, xtest_tee_7016,
+ADBG_CASE_DEFINE(regression, 7016, xtest_tee_7016,
"CloseSession_null CLOSE_SESSION_IGNORE_SESSION_NULL");
-ADBG_CASE_DEFINE(XTEST_TEE_7017, xtest_tee_7017,
+ADBG_CASE_DEFINE(regression, 7017, xtest_tee_7017,
"InitializeContext_NotExistingTEE INITIALIZE_CONTEXT_NAMES");
-ADBG_CASE_DEFINE(XTEST_TEE_7018, xtest_tee_7018,
+ADBG_CASE_DEFINE(regression, 7018, xtest_tee_7018,
"FinalizeContext_null FINALIZE_CONTEXT_IGNORE_NULL");
-ADBG_CASE_DEFINE(XTEST_TEE_7019, xtest_tee_7019,
+ADBG_CASE_DEFINE(regression, 7019, xtest_tee_7019,
"InitializeContext_concurrentContext INITIALIZE_CONTEXT_NAMES");
diff --git a/demos/optee_test/host/xtest/xtest_10000.c b/demos/optee_test/host/xtest/regression_8000.c
index cdaca1c..d92bbd9 100644
--- a/demos/optee_test/host/xtest/xtest_10000.c
+++ b/demos/optee_test/host/xtest/regression_8000.c
@@ -23,12 +23,12 @@
#define WITH_CONCAT_KDF 1
#define WITH_PBKDF2 1
-static void xtest_tee_test_10001(ADBG_Case_t *c);
-static void xtest_tee_test_10002(ADBG_Case_t *c);
+static void xtest_tee_test_8001(ADBG_Case_t *c);
+static void xtest_tee_test_8002(ADBG_Case_t *c);
-ADBG_CASE_DEFINE(XTEST_TEE_10001, xtest_tee_test_10001,
+ADBG_CASE_DEFINE(regression, 8001, xtest_tee_test_8001,
"Test TEE Internal API key derivation extensions");
-ADBG_CASE_DEFINE(XTEST_TEE_10002, xtest_tee_test_10002,
+ADBG_CASE_DEFINE(regression, 8002, xtest_tee_test_8002,
"Secure Storage Key Manager API Self Test");
/*
@@ -585,9 +585,9 @@ out:
static void xtest_test_derivation_pbkdf2(ADBG_Case_t *c, TEEC_Session *session)
{
size_t n;
-#define TEST_PBKDF2_DATA(section, algo, id, oeb /* omit empty bufs */) \
+#define TEST_PBKDF2_DATA(level, section, algo, id, oeb /* omit empty bufs */) \
{ \
- section, algo, \
+ level, section, algo, \
pbkdf2_##id##_password, sizeof(pbkdf2_##id##_password), \
(oeb && !sizeof(pbkdf2_##id##_salt)) ? NULL : pbkdf2_##id##_salt, sizeof(pbkdf2_##id##_salt), \
pbkdf2_##id##_iteration_count, \
@@ -595,10 +595,11 @@ static void xtest_test_derivation_pbkdf2(ADBG_Case_t *c, TEEC_Session *session)
}
#define _TO_STR(n) #n
#define TO_STR(n) _TO_STR(n)
-#define RFC6070_TEST(n) \
- TEST_PBKDF2_DATA("RFC 6070 " TO_STR(n) " (HMAC-SHA1)", \
+#define RFC6070_TEST(l, n) \
+ TEST_PBKDF2_DATA(l, "RFC 6070 " TO_STR(n) " (HMAC-SHA1)", \
TEE_ALG_PBKDF2_HMAC_SHA1_DERIVE_KEY, n, false)
static struct pbkdf2_case {
+ unsigned int level;
const char *subcase_name;
uint32_t algo;
const uint8_t *password;
@@ -609,11 +610,9 @@ static void xtest_test_derivation_pbkdf2(ADBG_Case_t *c, TEEC_Session *session)
const uint8_t *dkm;
size_t dkm_len;
} pbkdf2_cases[] = {
- RFC6070_TEST(1), RFC6070_TEST(2), RFC6070_TEST(3),
-#if 0
- RFC6070_TEST(4), /* Lengthy! (3 min on my PC / QEMU) */
-#endif
- RFC6070_TEST(5), RFC6070_TEST(6)
+ RFC6070_TEST(0, 1), RFC6070_TEST(0, 2), RFC6070_TEST(0, 3),
+ RFC6070_TEST(15, 4), /* Lengthy! (2 min on HiKey @1.2GHz) */
+ RFC6070_TEST(0, 5), RFC6070_TEST(0, 6)
};
size_t max_size = 2048;
@@ -627,6 +626,9 @@ static void xtest_test_derivation_pbkdf2(ADBG_Case_t *c, TEEC_Session *session)
size_t out_size;
const struct pbkdf2_case *pc = &pbkdf2_cases[n];
+ if (pc->level > level)
+ continue;
+
Do_ADBG_BeginSubCase(c, "PBKDF2 %s", pc->subcase_name);
if (!ADBG_EXPECT_TEEC_SUCCESS(c,
ta_crypt_cmd_allocate_operation(c, session, &op,
@@ -721,7 +723,7 @@ static TEEC_Result enc_fs_km_self_test(TEEC_Session *sess)
return res;
}
-static void xtest_tee_test_10001(ADBG_Case_t *c)
+static void xtest_tee_test_8001(ADBG_Case_t *c)
{
TEEC_Session session = { 0 };
uint32_t ret_orig;
@@ -745,7 +747,7 @@ static void xtest_tee_test_10001(ADBG_Case_t *c)
}
/* secure storage key manager self test */
-static void xtest_tee_test_10002(ADBG_Case_t *c)
+static void xtest_tee_test_8002(ADBG_Case_t *c)
{
TEEC_Result res;
TEEC_Session sess;
diff --git a/demos/optee_test/host/xtest/xtest_20000.c b/demos/optee_test/host/xtest/regression_9000.c
index ddd0ae3..00f8645 100644
--- a/demos/optee_test/host/xtest/xtest_20000.c
+++ b/demos/optee_test/host/xtest/regression_9000.c
@@ -26,6 +26,7 @@
#include <xtest_helpers.h>
#include <tee_fs_key_manager.h>
+#include <fs_htree.h>
#include <tee_client_api.h>
#include <tee_api_defines_extensions.h>
@@ -34,21 +35,21 @@
#include <tee_api_types.h>
#include <util.h>
+#define BLOCK_SIZE (4 * 1024)
+
#define SIZE 1
#define NUMELEM 1
#define DUMPFILE 0
#define DUMPLIMIT 128
-#define CORRUPT_META_KEY_OFFSET offsetof(struct meta_header, encrypted_key)
-#define CORRUPT_META_IV_OFFSET (offsetof(struct meta_header, common) + \
- offsetof(struct common_header, iv))
-#define CORRUPT_META_TAG_OFFSET (offsetof(struct meta_header, common) + \
- offsetof(struct common_header, tag))
-#define CORRUPT_META_DATA_OFFSET sizeof(struct meta_header)
+#define CORRUPT_META_KEY_OFFSET offsetof(struct tee_fs_htree_image, enc_fek)
+#define CORRUPT_META_IV_OFFSET offsetof(struct tee_fs_htree_image, iv)
+#define CORRUPT_META_TAG_OFFSET offsetof(struct tee_fs_htree_image, tag)
+#define CORRUPT_META_DATA_OFFSET offsetof(struct tee_fs_htree_image, imeta)
-#define CORRUPT_BLOCK_IV_OFFSET offsetof(struct common_header, iv)
-#define CORRUPT_BLOCK_TAG_OFFSET offsetof(struct common_header, tag)
-#define CORRUPT_BLOCK_DATA_OFFSET sizeof(struct block_header)
+#define CORRUPT_BLOCK_IV_OFFSET offsetof(struct tee_fs_htree_node_image, iv)
+#define CORRUPT_BLOCK_TAG_OFFSET offsetof(struct tee_fs_htree_node_image, tag)
+#define CORRUPT_BLOCK_DATA_OFFSET 0
#define CORRUPT_FILE_RAND_BYTE 1024*4096+2
#define CORRUPT_FILE_FIRST_BYTE 1024*4096+1
@@ -58,11 +59,11 @@
#define MIN(a,b) ((a)<(b) ? (a) : (b))
#endif
-#define XTEST_ENC_FS(level, data_len, meta, block_num, version) \
+#define XTEST_ENC_FS(level, data_len, meta, block_num, block_vers, node_vers) \
{ \
level, \
data_len, \
- meta, block_num, version \
+ meta, block_num, block_vers, node_vers \
}
enum meta {
@@ -89,35 +90,36 @@ struct xtest_enc_fs_case {
uint32_t data_len;
uint8_t meta;
uint8_t block_num;
- uint8_t version;
+ uint8_t block_version;
+ uint8_t node_version;
};
static const struct xtest_enc_fs_case xtest_enc_fs_cases[] = {
- XTEST_ENC_FS(1, 1, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 2, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 3, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 4, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 8, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 16, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 32, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 64, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 128, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 256, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 512, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 1024, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 2048, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 3072, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 4094, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 4095, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(0, 4097, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(0, 4097, META0, BLOCK1, VERSION0),
- XTEST_ENC_FS(1, 4098, META0, BLOCK0, VERSION1),
- XTEST_ENC_FS(1, 4098, META0, BLOCK1, VERSION0),
- XTEST_ENC_FS(1, 1*4096, META0, BLOCK1, VERSION0),
- XTEST_ENC_FS(1, 2*4096, META0, BLOCK2, VERSION0),
- XTEST_ENC_FS(1, 3*4096, META0, BLOCK3, VERSION0),
- XTEST_ENC_FS(1, 4*4096, META0, BLOCK3, VERSION0),
- XTEST_ENC_FS(1, 4*4096, META0, BLOCK4, VERSION0),
+ XTEST_ENC_FS(1, 1, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 2, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 3, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 4, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 8, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 16, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 32, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 64, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 128, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 256, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 512, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 1024, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 2048, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 3072, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 4094, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 4095, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(0, 4097, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(0, 4097, META1, BLOCK1, VERSION1, VERSION1),
+ XTEST_ENC_FS(1, 4098, META1, BLOCK0, VERSION0, VERSION1),
+ XTEST_ENC_FS(1, 4098, META1, BLOCK1, VERSION1, VERSION1),
+ XTEST_ENC_FS(1, 1*4096, META1, BLOCK1, VERSION1, VERSION1),
+ XTEST_ENC_FS(1, 2*4096, META1, BLOCK2, VERSION1, VERSION1),
+ XTEST_ENC_FS(1, 3*4096, META1, BLOCK3, VERSION1, VERSION1),
+ XTEST_ENC_FS(1, 4*4096, META1, BLOCK3, VERSION1, VERSION1),
+ XTEST_ENC_FS(1, 4*4096, META1, BLOCK4, VERSION1, VERSION1),
};
static TEEC_Result obj_open(TEEC_Session *sess, void *id, uint32_t id_size,
@@ -265,7 +267,7 @@ static int is_obj_present(TEEC_UUID *p_uuid, void *file_id,
if (ree_fs_get_ta_dirname(p_uuid, ta_dirname, sizeof(ta_dirname)) &&
get_obj_filename(file_id, file_id_length, obj_filename,
sizeof(obj_filename))) {
- snprintf(path, sizeof(path), "/tee/%s/%s",
+ snprintf(path, sizeof(path), "/data/tee/%s/%s",
ta_dirname, obj_filename);
return !stat(path, &sb);
@@ -273,9 +275,88 @@ static int is_obj_present(TEEC_UUID *p_uuid, void *file_id,
return 0;
}
+static TEEC_Result get_offs_size(enum tee_fs_htree_type type, size_t idx,
+ uint8_t vers, size_t *offs, size_t *size)
+{
+ const size_t node_size = sizeof(struct tee_fs_htree_node_image);
+ const size_t block_nodes = BLOCK_SIZE / (node_size * 2);
+ size_t pbn;
+ size_t bidx;
+ size_t sz;
+
+ /*
+ * File layout
+ *
+ * phys block 0:
+ * tee_fs_htree_image vers 0 @ offs = 0
+ * tee_fs_htree_image vers 1 @ offs = sizeof(tee_fs_htree_image)
+ *
+ * phys block 1:
+ * tee_fs_htree_node_image 0 vers 0 @ offs = 0
+ * tee_fs_htree_node_image 0 vers 1 @ offs = node_size
+ * tee_fs_htree_node_image 1 vers 0 @ offs = node_size * 2
+ * tee_fs_htree_node_image 1 vers 1 @ offs = node_size * 3
+ * ...
+ * tee_fs_htree_node_image 61 vers 0 @ offs = node_size * 122
+ * tee_fs_htree_node_image 61 vers 1 @ offs = node_size * 123
+ *
+ * phys block 2:
+ * data block 0 vers 0
+ *
+ * phys block 3:
+ * data block 0 vers 1
+ *
+ * ...
+ * phys block 63:
+ * data block 61 vers 0
+ *
+ * phys block 64:
+ * data block 61 vers 1
+ *
+ * phys block 65:
+ * tee_fs_htree_node_image 62 vers 0 @ offs = 0
+ * tee_fs_htree_node_image 62 vers 1 @ offs = node_size
+ * tee_fs_htree_node_image 63 vers 0 @ offs = node_size * 2
+ * tee_fs_htree_node_image 63 vers 1 @ offs = node_size * 3
+ * ...
+ * tee_fs_htree_node_image 121 vers 0 @ offs = node_size * 122
+ * tee_fs_htree_node_image 121 vers 1 @ offs = node_size * 123
+ *
+ * ...
+ */
+
+ switch (type) {
+ case TEE_FS_HTREE_TYPE_HEAD:
+ *offs = sizeof(struct tee_fs_htree_image) * vers;
+ sz = sizeof(struct tee_fs_htree_image);
+ break;
+ case TEE_FS_HTREE_TYPE_NODE:
+ pbn = 1 + ((idx / block_nodes) * block_nodes * 2);
+ *offs = pbn * BLOCK_SIZE +
+ 2 * node_size * (idx % block_nodes) +
+ node_size * vers;
+ sz = node_size;
+ break;
+ case TEE_FS_HTREE_TYPE_BLOCK:
+ bidx = 2 * idx + vers;
+ pbn = 2 + bidx + bidx / (block_nodes * 2 - 1);
+ *offs = pbn * BLOCK_SIZE;
+ sz = BLOCK_SIZE;
+ break;
+ default:
+ return TEEC_ERROR_BAD_PARAMETERS;
+ break;
+ }
+
+ if (size)
+ *size = sz;
+
+ return TEEC_SUCCESS;
+}
+
static TEEC_Result obj_corrupt(TEEC_UUID *p_uuid, void *file_id,
uint32_t file_id_length,
- uint32_t offset, enum tee_fs_file_type file_type,
+ uint32_t offset, enum tee_fs_htree_type type,
uint8_t block_num, uint8_t version)
{
char ta_dirname[32 + 1];
@@ -288,12 +369,7 @@ static TEEC_Result obj_corrupt(TEEC_UUID *p_uuid, void *file_id,
int i;
int num_corrupt_bytes = SIZE * NUMELEM;
size_t real_offset;
- const size_t meta_block_size = sizeof(struct meta_header) +
- sizeof(struct tee_fs_file_meta);
- const size_t meta_info_size = sizeof(struct meta_header) +
- sizeof(struct tee_fs_file_info);
- const size_t block_size = sizeof(struct block_header) +
- BLOCK_FILE_SIZE;
+ size_t node_size = sizeof(struct tee_fs_htree_node_image);
memset(name, 0, sizeof(name));
@@ -307,29 +383,27 @@ static TEEC_Result obj_corrupt(TEEC_UUID *p_uuid, void *file_id,
* and rewrite this value at the same offset
*/
- snprintf(name, sizeof(name), "/tee/%s/%s",
+ snprintf(name, sizeof(name), "/data/tee/%s/%s",
ta_dirname, obj_filename);
- real_offset = sizeof(uint32_t); /* meta counter */
- if (file_type == META_FILE) {
- real_offset += version * meta_block_size;
- } else if (file_type == BLOCK_FILE) {
- real_offset += meta_block_size * 2;
- real_offset += (block_num * 2 + version) * block_size;
+ tee_res = get_offs_size(type, block_num, version, &real_offset, NULL);
+ if (tee_res != TEEC_SUCCESS) {
+ fprintf(stderr, "invalid type\n");
+ goto exit;
}
if (offset == CORRUPT_FILE_LAST_BYTE) {
- if (file_type == META_FILE)
- real_offset += meta_info_size;
+ if (type == TEE_FS_HTREE_TYPE_HEAD)
+ real_offset += node_size;
else
- real_offset += block_size;
+ real_offset += BLOCK_SIZE;
real_offset -= num_corrupt_bytes;
} else if (offset == CORRUPT_FILE_RAND_BYTE) {
srand(time(NULL));
- if (file_type == META_FILE)
- real_offset += rand() % (meta_info_size - 1);
+ if (type == TEE_FS_HTREE_TYPE_HEAD)
+ real_offset += rand() % (node_size - 1);
else
- real_offset += rand() % (block_size - 1);
+ real_offset += rand() % (BLOCK_SIZE - 1);
num_corrupt_bytes = 1;
} else if (offset != CORRUPT_FILE_FIRST_BYTE) {
real_offset += offset;
@@ -400,7 +474,7 @@ exit:
}
static void storage_corrupt(ADBG_Case_t *c,
- enum tee_fs_file_type file_type,
+ enum tee_fs_htree_type file_type,
uint32_t offset
)
{
@@ -410,7 +484,9 @@ static void storage_corrupt(ADBG_Case_t *c,
unsigned int error;
uint32_t obj_id;
uint32_t nb;
+ uint32_t f;
size_t n;
+ uint8_t vers;
char *filedata = NULL;
@@ -460,20 +536,21 @@ static void storage_corrupt(ADBG_Case_t *c,
else
goto exit;
- if (file_type == META_FILE)
+ f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE_META;
+
+ if (file_type == TEE_FS_HTREE_TYPE_HEAD)
ADBG_EXPECT_COMPARE_UNSIGNED(c, 0, !=,
is_obj_present(&uuid, filename,
ARRAY_SIZE(filename)));
- if (file_type == BLOCK_FILE)
+ if (file_type == TEE_FS_HTREE_TYPE_BLOCK)
ADBG_EXPECT_COMPARE_UNSIGNED(c, 0, !=,
is_obj_present(&uuid, filename,
ARRAY_SIZE(filename)));
ADBG_EXPECT(c, TEE_SUCCESS,
obj_open(&sess, filename, ARRAY_SIZE(filename),
- TEE_DATA_FLAG_ACCESS_READ |
- TEE_DATA_FLAG_ACCESS_WRITE_META, &obj_id));
+ f, &obj_id));
ADBG_EXPECT(c, TEE_SUCCESS,
obj_read(&sess, obj_id, buffer, tv->data_len, &nb));
@@ -481,72 +558,77 @@ static void storage_corrupt(ADBG_Case_t *c,
ADBG_EXPECT(c, TEE_SUCCESS,
obj_close(&sess, obj_id));
- switch (file_type) {
- case META_FILE:
- /* corrupt object */
- if (!ADBG_EXPECT(c, TEE_SUCCESS,
- obj_corrupt(&uuid, filename,
- ARRAY_SIZE(filename), offset,
- file_type, tv->meta, tv->meta)))
- goto exit;
-
- ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_CORRUPT_OBJECT,
- obj_open(&sess, filename,
- ARRAY_SIZE(filename),
- TEE_DATA_FLAG_ACCESS_READ |
- TEE_DATA_FLAG_ACCESS_WRITE_META,
- &obj_id));
-
- ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
- obj_open(&sess, filename,
- ARRAY_SIZE(filename),
- TEE_DATA_FLAG_ACCESS_READ |
- TEE_DATA_FLAG_ACCESS_WRITE_META,
- &obj_id));
-
- ADBG_EXPECT_COMPARE_UNSIGNED(c, 0, ==,
- is_obj_present(&uuid, filename,
- ARRAY_SIZE(filename)));
- break;
- case BLOCK_FILE:
- /* corrupt object */
- if (!ADBG_EXPECT(c, TEE_SUCCESS,
+ switch (file_type) {
+ case TEE_FS_HTREE_TYPE_HEAD:
+ /* corrupt object */
+ if (!ADBG_EXPECT(c, TEE_SUCCESS,
obj_corrupt(&uuid, filename,
- ARRAY_SIZE(filename),
- offset, file_type,
- tv->block_num, tv->version)))
- goto exit;
+ ARRAY_SIZE(filename), offset,
+ file_type, tv->meta, tv->meta)))
+ goto exit;
- if ( tv->block_num == BLOCK0 ) {
- ADBG_EXPECT(c, TEE_ERROR_CORRUPT_OBJECT,
- obj_open(&sess, filename,
- ARRAY_SIZE(filename),
- TEE_DATA_FLAG_ACCESS_READ |
- TEE_DATA_FLAG_ACCESS_WRITE_META,
- &obj_id));
- } else {
- ADBG_EXPECT(c, TEE_SUCCESS,
- obj_open(&sess, filename,
+ ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_CORRUPT_OBJECT,
+ obj_open(&sess, filename,
+ ARRAY_SIZE(filename),
+ f, &obj_id));
+
+ ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
+ obj_open(&sess, filename,
ARRAY_SIZE(filename),
- TEE_DATA_FLAG_ACCESS_READ |
- TEE_DATA_FLAG_ACCESS_WRITE_META,
- &obj_id));
+ f, &obj_id));
- ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_CORRUPT_OBJECT,
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, 0, ==,
+ is_obj_present(&uuid, filename,
+ ARRAY_SIZE(filename)));
+ break;
+
+ case TEE_FS_HTREE_TYPE_NODE:
+ case TEE_FS_HTREE_TYPE_BLOCK:
+ if (file_type == TEE_FS_HTREE_TYPE_NODE)
+ vers = tv->node_version;
+ else
+ vers = tv->block_version;
+
+ /* corrupt object */
+ if (!ADBG_EXPECT(c, TEE_SUCCESS,
+ obj_corrupt(&uuid, filename,
+ ARRAY_SIZE(filename),
+ offset, file_type,
+ tv->block_num, vers)))
+ goto exit;
+
+ /*
+ * All nodes are currently verified when opening so
+ * any corrupt node will be detected. This will
+ * change if lazy loading of nodes is implemented.
+ */
+ if (tv->block_num == BLOCK0 ||
+ (file_type == TEE_FS_HTREE_TYPE_NODE &&
+ tv->block_num <= BLOCK5)) {
+ ADBG_EXPECT(c, TEE_ERROR_CORRUPT_OBJECT,
+ obj_open(&sess, filename,
+ ARRAY_SIZE(filename),
+ f, &obj_id));
+ } else {
+ ADBG_EXPECT(c, TEE_SUCCESS,
+ obj_open(&sess, filename,
+ ARRAY_SIZE(filename),
+ f, &obj_id));
+
+ ADBG_EXPECT_TEEC_RESULT(c,
+ TEE_ERROR_CORRUPT_OBJECT,
obj_read(&sess, obj_id, buffer,
- tv->data_len, &nb));
- }
+ tv->data_len, &nb));
+ }
- ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
+ ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
obj_open(&sess, filename, ARRAY_SIZE(filename),
- TEE_DATA_FLAG_ACCESS_READ |
- TEE_DATA_FLAG_ACCESS_WRITE_META,
- &obj_id));
+ f, &obj_id));
- ADBG_EXPECT_COMPARE_UNSIGNED(c, 0, ==,
- is_obj_present(&uuid, filename,
- ARRAY_SIZE(filename)));
+ ADBG_EXPECT_COMPARE_UNSIGNED(c, 0, ==,
+ is_obj_present(&uuid, filename,
+ ARRAY_SIZE(filename)));
break;
default:
@@ -566,130 +648,130 @@ exit:
}
/* Corrupt Meta Encrypted Key */
-static void xtest_tee_test_20001(ADBG_Case_t *c)
+static void xtest_tee_test_9001(ADBG_Case_t *c)
{
- storage_corrupt(c, META_FILE, CORRUPT_META_KEY_OFFSET
+ storage_corrupt(c, TEE_FS_HTREE_TYPE_HEAD, CORRUPT_META_KEY_OFFSET
);
}
/* Corrupt Meta IV */
-static void xtest_tee_test_20002(ADBG_Case_t *c)
+static void xtest_tee_test_9002(ADBG_Case_t *c)
{
- storage_corrupt(c, META_FILE, CORRUPT_META_IV_OFFSET
+ storage_corrupt(c, TEE_FS_HTREE_TYPE_HEAD, CORRUPT_META_IV_OFFSET
);
}
/* Corrupt Meta Tag */
-static void xtest_tee_test_20003(ADBG_Case_t *c)
+static void xtest_tee_test_9003(ADBG_Case_t *c)
{
- storage_corrupt(c, META_FILE, CORRUPT_META_TAG_OFFSET
+ storage_corrupt(c, TEE_FS_HTREE_TYPE_HEAD, CORRUPT_META_TAG_OFFSET
);
}
/* Corrupt Meta Data */
-static void xtest_tee_test_20004(ADBG_Case_t *c)
+static void xtest_tee_test_9004(ADBG_Case_t *c)
{
storage_corrupt(c,
- META_FILE, CORRUPT_META_DATA_OFFSET
+ TEE_FS_HTREE_TYPE_HEAD, CORRUPT_META_DATA_OFFSET
);
}
/* Corrupt Meta File : first byte */
-static void xtest_tee_test_20021(ADBG_Case_t *c)
+static void xtest_tee_test_9021(ADBG_Case_t *c)
{
- storage_corrupt(c, META_FILE, CORRUPT_FILE_FIRST_BYTE
+ storage_corrupt(c, TEE_FS_HTREE_TYPE_HEAD, CORRUPT_FILE_FIRST_BYTE
);
}
/* Corrupt Meta File : last byte */
-static void xtest_tee_test_20022(ADBG_Case_t *c)
+static void xtest_tee_test_9022(ADBG_Case_t *c)
{
- storage_corrupt(c, META_FILE, CORRUPT_FILE_LAST_BYTE
+ storage_corrupt(c, TEE_FS_HTREE_TYPE_HEAD, CORRUPT_FILE_LAST_BYTE
);
}
/* Corrupt Meta File : random byte */
-static void xtest_tee_test_20023(ADBG_Case_t *c)
+static void xtest_tee_test_9023(ADBG_Case_t *c)
{
- storage_corrupt(c, META_FILE, CORRUPT_FILE_RAND_BYTE
+ storage_corrupt(c, TEE_FS_HTREE_TYPE_HEAD, CORRUPT_FILE_RAND_BYTE
);
}
/* Corrupt Block IV */
-static void xtest_tee_test_20501(ADBG_Case_t *c)
+static void xtest_tee_test_9501(ADBG_Case_t *c)
{
- storage_corrupt(c, BLOCK_FILE, CORRUPT_BLOCK_IV_OFFSET
+ storage_corrupt(c, TEE_FS_HTREE_TYPE_NODE, CORRUPT_BLOCK_IV_OFFSET
);
}
/* Corrupt Block Tag */
-static void xtest_tee_test_20502(ADBG_Case_t *c)
+static void xtest_tee_test_9502(ADBG_Case_t *c)
{
- storage_corrupt(c, BLOCK_FILE, CORRUPT_BLOCK_TAG_OFFSET
+ storage_corrupt(c, TEE_FS_HTREE_TYPE_NODE, CORRUPT_BLOCK_TAG_OFFSET
);
}
/* Corrupt Block Data */
-static void xtest_tee_test_20503(ADBG_Case_t *c)
+static void xtest_tee_test_9503(ADBG_Case_t *c)
{
- storage_corrupt(c, BLOCK_FILE, CORRUPT_BLOCK_DATA_OFFSET
+ storage_corrupt(c, TEE_FS_HTREE_TYPE_BLOCK, CORRUPT_BLOCK_DATA_OFFSET
);
}
/* Corrupt Block File : first byte */
-static void xtest_tee_test_20521(ADBG_Case_t *c)
+static void xtest_tee_test_9521(ADBG_Case_t *c)
{
- storage_corrupt(c, BLOCK_FILE, CORRUPT_FILE_FIRST_BYTE
+ storage_corrupt(c, TEE_FS_HTREE_TYPE_BLOCK, CORRUPT_FILE_FIRST_BYTE
);
}
/* Corrupt Block File : last byte */
-static void xtest_tee_test_20522(ADBG_Case_t *c)
+static void xtest_tee_test_9522(ADBG_Case_t *c)
{
- storage_corrupt(c, BLOCK_FILE, CORRUPT_FILE_LAST_BYTE
+ storage_corrupt(c, TEE_FS_HTREE_TYPE_BLOCK, CORRUPT_FILE_LAST_BYTE
);
}
/* Corrupt Block File : random byte */
-static void xtest_tee_test_20523(ADBG_Case_t *c)
+static void xtest_tee_test_9523(ADBG_Case_t *c)
{
- storage_corrupt(c, BLOCK_FILE, CORRUPT_FILE_RAND_BYTE
+ storage_corrupt(c, TEE_FS_HTREE_TYPE_BLOCK, CORRUPT_FILE_RAND_BYTE
);
}
-ADBG_CASE_DEFINE(XTEST_TEE_20001, xtest_tee_test_20001,
+ADBG_CASE_DEFINE(regression, 9001, xtest_tee_test_9001,
"Sanity Test Corrupt Meta Encrypted Key");
-ADBG_CASE_DEFINE(XTEST_TEE_20002, xtest_tee_test_20002,
+ADBG_CASE_DEFINE(regression, 9002, xtest_tee_test_9002,
"Sanity Test Corrupt Meta IV");
-ADBG_CASE_DEFINE(XTEST_TEE_20003, xtest_tee_test_20003,
+ADBG_CASE_DEFINE(regression, 9003, xtest_tee_test_9003,
"Sanity Test Corrupt Meta Tag");
-ADBG_CASE_DEFINE(XTEST_TEE_20004, xtest_tee_test_20004,
+ADBG_CASE_DEFINE(regression, 9004, xtest_tee_test_9004,
"Sanity Test Corrupt Meta Data");
-ADBG_CASE_DEFINE(XTEST_TEE_20021, xtest_tee_test_20021,
+ADBG_CASE_DEFINE(regression, 9021, xtest_tee_test_9021,
"Sanity Test Corrupt Meta File : first byte");
-ADBG_CASE_DEFINE(XTEST_TEE_20022, xtest_tee_test_20022,
+ADBG_CASE_DEFINE(regression, 9022, xtest_tee_test_9022,
"Sanity Test Corrupt Meta File : last byte");
-ADBG_CASE_DEFINE(XTEST_TEE_20023, xtest_tee_test_20023,
+ADBG_CASE_DEFINE(regression, 9023, xtest_tee_test_9023,
"Sanity Test Corrupt Meta File : random byte");
-ADBG_CASE_DEFINE(XTEST_TEE_20501, xtest_tee_test_20501,
+ADBG_CASE_DEFINE(regression, 9501, xtest_tee_test_9501,
"Sanity Test Corrupt Block IV");
-ADBG_CASE_DEFINE(XTEST_TEE_20502, xtest_tee_test_20502,
+ADBG_CASE_DEFINE(regression, 9502, xtest_tee_test_9502,
"Sanity Test Corrupt Block Tag");
-ADBG_CASE_DEFINE(XTEST_TEE_20503, xtest_tee_test_20503,
+ADBG_CASE_DEFINE(regression, 9503, xtest_tee_test_9503,
"Sanity Test Corrupt Block Data");
-ADBG_CASE_DEFINE(XTEST_TEE_20521, xtest_tee_test_20521,
+ADBG_CASE_DEFINE(regression, 9521, xtest_tee_test_9521,
"Sanity Test Corrupt Block File : first byte");
-ADBG_CASE_DEFINE(XTEST_TEE_20522, xtest_tee_test_20522,
+ADBG_CASE_DEFINE(regression, 9522, xtest_tee_test_9522,
"Sanity Test Corrupt Block File : last byte");
-ADBG_CASE_DEFINE(XTEST_TEE_20523, xtest_tee_test_20523,
+ADBG_CASE_DEFINE(regression, 9523, xtest_tee_test_9523,
"Sanity Test Corrupt Block File : random byte");
#endif /* defined(CFG_REE_FS) */
diff --git a/demos/optee_test/host/xtest/sdp_basic.c b/demos/optee_test/host/xtest/sdp_basic.c
new file mode 100644
index 0000000..f7bd5a6
--- a/dev/null
+++ b/demos/optee_test/host/xtest/sdp_basic.c
@@ -0,0 +1,589 @@
+/*
+ * 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 <err.h>
+#include <fcntl.h>
+#include <pta_invoke_tests.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <tee_client_api.h>
+#include <tee_client_api_extensions.h>
+#include <unistd.h>
+
+#include "crypto_common.h"
+#include "sdp_basic.h"
+#include "xtest_test.h"
+
+/*
+ * SDP basic test setup overview.
+ *
+ * - A dedicated trusted application (SDP basic TA) supports 3 commands:
+ * - 'inject' data from a nonsecure buffer into a secure buffer
+ * - 'transform' data inside a secure buffer (bitwise invert + unsigned incr)
+ * - 'dump' data from a secure buffer into a nonsecure buffer
+
+ * - This test client application (CA) invokes the TA for these 3 operations,
+ * inject random value, trasforming them then dump them.
+ *
+ * To do so, CA allocates a 'SDP secure buffer' and invoke the TA for these 3
+ * operations (inject then transform then dump) over the allocate buffer.
+ *
+ * The secure buffer is currently allocation through ION support adn
+ * registered to OP-TEE and as shared memory.
+ *
+ * To enhance test coverage against buffer alignement usecase, the CA invokes
+ * the TA with a variable offset inside the buffer. As CA injects random data
+ * into the buffer, the CA uses one of the random bytes to set the value of the
+ * offset in the accessed secure buffer.
+ *
+ * For debugging support, the CA may map (in nonsecure world) the secure
+ * buffer to read its content. As this is unsafe on a hardened platform, this
+ * operation is default disable. When enable, error only print out a warning
+ * trace but does not actually fail the test. This also give an easy way to
+ * check that some HW complains on access violation when nonsecure accesses
+ * secure data.
+ */
+
+static int verbosity = 1;
+
+struct tee_ctx {
+ TEEC_Context ctx;
+ TEEC_Session sess;
+};
+
+int allocate_ion_buffer(size_t size, int heap_id)
+{
+ struct ion_allocation_data alloc_data;
+ struct ion_handle_data hdl_data;
+ struct ion_fd_data fd_data;
+ int ion;
+ int fd = -1;
+
+ ion = open("/dev/ion", O_RDWR);
+ if (ion < 0) {
+ fprintf(stderr, "Error; failed to open /dev/ion\n");
+ verbose("Seems no ION heap is available.\n");
+ verbose("To test ION allocation you can enable\n");
+ verbose("CONFIG_ION and CONFIG_ION_DUMMY in your\n");
+ verbose("linux kernel configuration.\n");
+ return fd;
+ }
+
+ if (heap_id < 0)
+ heap_id = DEFAULT_ION_HEAP_TYPE;
+
+ verbose("Allocate in ION heap '%s'\n",
+ heap_id == ION_HEAP_TYPE_SYSTEM ? "system" :
+ heap_id == ION_HEAP_TYPE_SYSTEM_CONTIG ? "system contig" :
+ heap_id == ION_HEAP_TYPE_CARVEOUT ? "carveout" :
+ heap_id == ION_HEAP_TYPE_CHUNK ? "chunk" :
+ heap_id == ION_HEAP_TYPE_DMA ? "dma" :
+ heap_id == ION_HEAP_TYPE_UNMAPPED ? "unmapped" :
+ "custom");
+
+ alloc_data.len = size;
+ alloc_data.align = 0;
+ alloc_data.flags = 0;
+ alloc_data.heap_id_mask = 1 << heap_id;
+ if (ioctl(ion, ION_IOC_ALLOC, &alloc_data) == -1)
+ goto out;
+
+ fd_data.handle = alloc_data.handle;
+ if (ioctl(ion, ION_IOC_SHARE, &fd_data) != -1)
+ fd = fd_data.fd;
+
+ hdl_data.handle = alloc_data.handle;
+ (void)ioctl(ion, ION_IOC_FREE, &hdl_data);
+out:
+ close(ion);
+ return fd;
+}
+
+static void finalize_tee_ctx(struct tee_ctx *ctx)
+{
+ if (!ctx)
+ return;
+
+ TEEC_CloseSession(&ctx->sess);
+ TEEC_FinalizeContext(&ctx->ctx);
+}
+
+static int create_tee_ctx(struct tee_ctx *ctx, enum test_target_ta target_ta)
+{
+ TEEC_Result teerc;
+ const 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 = &sdp_basic_ta_uuid;
+ break;
+ case TEST_NS_TO_PTA:
+ uuid = &pta_invoke_tests_ta_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,
+ TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
+ if (teerc != TEEC_SUCCESS)
+ 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;
+}
+
+static int tee_register_buffer(struct tee_ctx *ctx, void **shm_ref, int fd)
+{
+ TEEC_Result teerc;
+ TEEC_SharedMemory *shm;
+
+ shm = malloc(sizeof(*shm));
+ if (!shm)
+ return 1;
+
+ shm->flags = TEEC_MEM_INPUT | TEEC_MEM_OUTPUT;
+ teerc = TEEC_RegisterSharedMemoryFileDescriptor(&ctx->ctx, shm, fd);
+ if (teerc != TEEC_SUCCESS) {
+ fprintf(stderr, "Error: TEEC_RegisterMemoryFileDescriptor() failed %x\n",
+ teerc);
+ return 1;
+ }
+
+ *shm_ref = shm;
+ return 0;
+}
+
+static void tee_deregister_buffer(struct tee_ctx *ctx, void *shm_ref)
+{
+ (void)ctx;
+
+ if (!shm_ref)
+ return;
+
+ TEEC_ReleaseSharedMemory((TEEC_SharedMemory *)shm_ref);
+ free(shm_ref);
+}
+
+static int inject_sdp_data(struct tee_ctx *ctx,
+ void *in, size_t offset, size_t len, void *shm_ref, int ind)
+{
+ TEEC_SharedMemory *shm = (TEEC_SharedMemory *)shm_ref;
+ TEEC_Result teerc;
+ TEEC_Operation op;
+ uint32_t err_origin;
+ 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,
+ TEEC_MEMREF_PARTIAL_OUTPUT,
+ TEEC_NONE, TEEC_NONE);
+
+ op.params[0].tmpref.buffer = in;
+ op.params[0].tmpref.size = len;
+
+ op.params[1].memref.parent = shm;
+ op.params[1].memref.size = len;
+ op.params[1].memref.offset = offset;
+
+ teerc = TEEC_InvokeCommand(&ctx->sess, cmd, &op, &err_origin);
+ if (teerc != TEEC_SUCCESS)
+ fprintf(stderr, "Error: invoke SDP test TA (inject) failed %x %d\n",
+ teerc, err_origin);
+
+ return (teerc == TEEC_SUCCESS) ? 0 : -1;
+}
+
+static int transform_sdp_data(struct tee_ctx *ctx,
+ size_t offset, size_t len, void *shm_ref, int ind)
+{
+ TEEC_SharedMemory *shm = (TEEC_SharedMemory *)shm_ref;
+ TEEC_Result teerc;
+ TEEC_Operation op;
+ uint32_t err_origin;
+ 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,
+ TEEC_NONE, TEEC_NONE, TEEC_NONE);
+ op.params[0].memref.parent = shm;
+ op.params[0].memref.size = len;
+ op.params[0].memref.offset = offset;
+
+ teerc = TEEC_InvokeCommand(&ctx->sess, cmd, &op, &err_origin);
+ if (teerc != TEEC_SUCCESS)
+ fprintf(stderr, "Error: invoke SDP test TA (transform) failed %x %d\n",
+ teerc, err_origin);
+
+ return (teerc == TEEC_SUCCESS) ? 0 : -1;
+}
+
+static int dump_sdp_data(struct tee_ctx *ctx,
+ void *out, size_t offset, size_t len, void *shm_ref, int ind)
+{
+ TEEC_SharedMemory *shm = (TEEC_SharedMemory *)shm_ref;
+ TEEC_Result teerc;
+ TEEC_Operation op;
+ uint32_t err_origin;
+ 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,
+ TEEC_MEMREF_TEMP_OUTPUT,
+ TEEC_NONE, TEEC_NONE);
+ op.params[0].memref.parent = shm;
+ op.params[0].memref.size = len;
+ op.params[0].memref.offset = offset;
+
+ op.params[1].tmpref.buffer = out;
+ op.params[1].tmpref.size = len;
+
+ teerc = TEEC_InvokeCommand(&ctx->sess, cmd, &op, &err_origin);
+ if (teerc != TEEC_SUCCESS)
+ fprintf(stderr, "Error: invoke SDP test TA (dump) failed %x %d\n",
+ teerc, err_origin);
+
+ return (teerc == TEEC_SUCCESS) ? 0 : -1;
+}
+
+static int check_sdp_dumped(struct tee_ctx *ctx, void *ref, size_t len,
+ void *out)
+{
+ char *bref = (char *)ref;
+ char *data = (char *)out;
+ int err = 0;
+
+ (void)ctx;
+
+ while(len--)
+ if (*data++ != (unsigned char)(~(*bref++) + 1))
+ err++;
+
+ return err;
+}
+
+/*
+ * Consider 32kByte + 1 of random data is sufficient for an accurate test
+ * whatever the test buffer size is. Random buffer is read as a ring buffer.
+ */
+#define RANDOM_BUFFER_SIZE (32 * 1024 + 1)
+static int get_random_bytes(char *out, size_t len)
+{
+ static char *rand_buf = NULL;
+ static size_t rand_idx = 0;
+ int rc;
+
+ if (!rand_buf) {
+ const char rand_dev[] = "/dev/urandom";
+ int fd;
+
+ rand_buf = malloc(RANDOM_BUFFER_SIZE);
+ if (!rand_buf) {
+ fprintf(stderr, "failed to random buffer memory (%d bytes)\n",
+ RANDOM_BUFFER_SIZE);
+ return -1;
+ }
+
+ fd = open(rand_dev, O_RDONLY);
+ if (fd < 0) {
+ fprintf(stderr, "failed to open %s\n", rand_dev);
+ return -1;
+ }
+
+ rc = read(fd, rand_buf, RANDOM_BUFFER_SIZE);
+ if (rc != RANDOM_BUFFER_SIZE) {
+ fprintf(stderr, "failed to read %d bytes from %s\n",
+ RANDOM_BUFFER_SIZE, rand_dev);
+ return -1;
+ }
+ close(fd);
+ }
+
+ while (len) {
+ size_t t_len = (RANDOM_BUFFER_SIZE < len) ? RANDOM_BUFFER_SIZE : len;
+
+ if ((rand_idx + t_len) > RANDOM_BUFFER_SIZE) {
+ int sz_end = RANDOM_BUFFER_SIZE - rand_idx;
+ int sz_beg = t_len - sz_end;
+
+ memcpy(out, rand_buf + rand_idx, sz_end);
+ memcpy(out + sz_end, rand_buf , sz_beg);
+ rand_idx = sz_beg;
+ } else {
+ memcpy(out, rand_buf + rand_idx, t_len);
+ rand_idx += t_len;
+ }
+ len -= t_len;
+ }
+ return 0;
+}
+
+
+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;
+ unsigned char *ref_buf = NULL;
+ void *shm_ref = NULL;
+ unsigned int err = 1;
+ int fd = -1;
+ size_t sdp_size = size;
+ size_t offset;
+ size_t loop_cnt;
+
+ if (!loop) {
+ fprintf(stderr, "Error: null loop value\n");
+ return 1;
+ }
+
+ /* reduce size to enable offset tests (max offset is 255 bytes) */
+ if (rnd_offset)
+ size -= 255;
+
+ test_buf = malloc(size);
+ ref_buf = malloc(size);
+ if (!test_buf || !ref_buf) {
+ verbose("failed to allocate memory\n");
+ goto out;
+ }
+
+ fd = allocate_ion_buffer(sdp_size, ion_heap);
+ if (fd < 0) {
+ verbose("Failed to allocate SDP buffer (%zu bytes) in ION heap %d: %d\n",
+ sdp_size, ion_heap, fd);
+ goto out;
+ }
+
+ /* register secure buffer to TEE */
+ ctx = malloc(sizeof(*ctx));
+ if (!ctx)
+ goto out;
+ if (create_tee_ctx(ctx, ta))
+ goto out;
+ if (tee_register_buffer(ctx, &shm_ref, fd))
+ goto out;
+
+ /* release registered fd: tee should still hold refcount on resource */
+ close(fd);
+ fd = -1;
+
+ /* 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, ta))
+ goto out;
+
+ /* TA reads/writes into SDP buffer */
+ 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, ta))
+ 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;
+ }
+ }
+
+ err = 0;
+ verbose("%s: successed\n", __func__);
+out:
+ if (err)
+ verbose("test failed\n");
+ if (fd >= 0)
+ close(fd);
+ if (shm_ref)
+ tee_deregister_buffer(ctx, shm_ref);
+ finalize_tee_ctx(ctx);
+ free(ctx);
+ free(ref_buf);
+ free(test_buf);
+ return err;
+}
+
+#define _TO_STR(x) #x
+#define TO_STR(x) _TO_STR(x)
+
+static void usage(const char *progname, size_t size, int loop, int ion_heap)
+{
+ fprintf(stderr, "Usage: %s [OPTION]\n", progname);
+ fprintf(stderr,
+ "Testing basic accesses to secure buffer (SDP) on OP-TEE.\n"
+ "Allocates a secure buffer and invoke a TA to access it.\n"
+ "TA is used to init/transform/dump the secure buffer.\n"
+ "CA check dumped content.\n\n");
+
+ fprintf(stderr, "Options:\n");
+ fprintf(stderr, " -h|--help Print this help and exit\n");
+ fprintf(stderr, " -v Be verbose\n");
+ fprintf(stderr, " -s SIZE SDP buffer byte size [%zu]\n", size);
+ fprintf(stderr, " -n LOOP Test loop iterations [%u]\n", loop);
+ fprintf(stderr, " --ion-heap ID Target ION heap ID [%d]\n", ion_heap);
+ fprintf(stderr, " --no-offset No random offset [0 255] in buffer\n");
+}
+
+#define NEXT_ARG(i) \
+ do { \
+ if (++i == argc) { \
+ fprintf(stderr, "%s: %s: missing argument\n", \
+ argv[0], argv[i-1]); \
+ return 1; \
+ } \
+ } while (0);
+
+int sdp_basic_runner_cmd_parser(int argc, char *argv[])
+{
+ size_t test_size = 5000;
+ size_t test_loop = 1000;
+ int ion_heap = DEFAULT_ION_HEAP_TYPE;
+ int rnd_offset = 1;
+ int i;
+
+ /* Parse command line */
+ for (i = 1; i < argc; i++) {
+ if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {
+ usage(argv[0], test_size, test_loop, ion_heap);
+ return 0;
+ }
+ }
+ for (i = 1; i < argc; i++) {
+ if (!strcmp(argv[i], "-v")) {
+ verbosity++;
+ } else if (!strcmp(argv[i], "-s")) {
+ NEXT_ARG(i);
+ test_size = atoi(argv[i]);
+ } else if (!strcmp(argv[i], "-n")) {
+ NEXT_ARG(i);
+ test_loop = atoi(argv[i]);
+ } else if (!strcmp(argv[i], "--ion-heap")) {
+ NEXT_ARG(i);
+ ion_heap = atoi(argv[i]);
+ } else if (!strcmp(argv[i], "--no-offset")) {
+ rnd_offset = 0;
+ } else {
+ fprintf(stderr, "%s: invalid argument: %s\n",
+ argv[0], argv[i]);
+ usage(argv[0], test_size, test_loop, ion_heap);
+ return 1;
+ }
+ }
+
+ 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;
+
+ 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;
+
+ verbose("\nSecure Data Path basic accesses: NS invokes SDP pTA (shall fail)\n");
+ if (sdp_basic_test(TEST_NS_TO_PTA,
+ test_size, test_loop, ion_heap, rnd_offset))
+ verbose("-> false negative: pTAs refuse SDP memref from NS clients.\n");
+
+ return 0;
+}
diff --git a/demos/optee_test/host/xtest/sdp_basic.h b/demos/optee_test/host/xtest/sdp_basic.h
new file mode 100644
index 0000000..117eb77
--- a/dev/null
+++ b/demos/optee_test/host/xtest/sdp_basic.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 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 XTEST_SDP_BASIC_H
+#define XTEST_SDP_BASIC_H
+
+#include "include/uapi/linux/ion.h"
+#include "ta_sdp_basic.h"
+
+#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);
+int sdp_basic_test(enum test_target_ta ta,
+ size_t size, size_t loop, int ion_heap,
+ int rnd_offset);
+
+#endif /* XTEST_SDP_BASIC_H */
diff --git a/demos/optee_test/host/xtest/sha_perf.c b/demos/optee_test/host/xtest/sha_perf.c
index 0c3150e..bb40038 100644
--- a/demos/optee_test/host/xtest/sha_perf.c
+++ b/demos/optee_test/host/xtest/sha_perf.c
@@ -54,8 +54,7 @@ static TEEC_SharedMemory out_shm = {
.flags = TEEC_MEM_OUTPUT
};
-static void __attribute__((noreturn))
-errx(const char *msg, TEEC_Result res)
+static void errx(const char *msg, TEEC_Result res)
{
fprintf(stderr, "%s: 0x%08x", msg, res);
exit (1);
@@ -287,8 +286,8 @@ static double mb_per_sec(size_t size, double usec)
}
/* Hash test: buffer of size byte. Run test n times.
- * Entry point for running SHA benchmark
- * Params:
+ * Entry point for running SHA benchmark
+ * Params:
* algo - Algorithm
* size - Buffer size
* n - Number of measurements
@@ -296,10 +295,10 @@ static double mb_per_sec(size_t size, double usec)
* random_in - Get input from /dev/urandom
* offset - Buffer offset wrt. alloc-ed address
* warmup - Start with a-second busy loop
- * verbosity - Verbosity level
+ * verbosity - Verbosity level
* */
-extern void sha_perf_run_test(int algo, size_t size, unsigned int n,
- unsigned int l, int random_in, int offset,
+extern void sha_perf_run_test(int algo, size_t size, unsigned int n,
+ unsigned int l, int random_in, int offset,
int warmup, int verbosity)
{
uint64_t t;
@@ -307,8 +306,9 @@ extern void sha_perf_run_test(int algo, size_t size, unsigned int n,
TEEC_Operation op;
int n0 = n;
struct timespec ts;
+ double sd;
- vverbose("sha-perf version %s\n", TO_STR(VERSION));
+ vverbose("sha-perf\n");
if (clock_getres(CLOCK_MONOTONIC, &ts) < 0) {
perror("clock_getres");
return;
@@ -318,8 +318,7 @@ extern void sha_perf_run_test(int algo, size_t size, unsigned int n,
open_ta();
prepare_op(algo);
-
-
+
alloc_shm(size, algo, offset);
if (!random_in)
@@ -351,22 +350,26 @@ extern void sha_perf_run_test(int algo, size_t size, unsigned int n,
while (n-- > 0) {
t = run_test_once((uint8_t *)in_shm.buffer + offset, size, random_in, &op);
update_stats(&stats, t);
- if (n % (n0/10) == 0)
+ if (n % (n0 / 10) == 0)
vverbose("#");
}
vverbose("\n");
- printf("min=%gμs max=%gμs mean=%gμs stddev=%gμs (%gMiB/s)\n",
- stats.min/1000, stats.max/1000, stats.m/1000,
- stddev(&stats)/1000, mb_per_sec(size, stats.m));
+ sd = stddev(&stats);
+ printf("min=%gus max=%gus mean=%gus stddev=%gus (cv %g%%) (%gMiB/s)\n",
+ stats.min / 1000, stats.max / 1000, stats.m / 1000,
+ sd / 1000, 100 * sd / stats.m, mb_per_sec(size, stats.m));
+ verbose("2-sigma interval: %g..%gus (%g..%gMiB/s)\n",
+ (stats.m - 2 * sd) / 1000, (stats.m + 2 * sd) / 1000,
+ mb_per_sec(size, stats.m + 2 * sd),
+ mb_per_sec(size, stats.m - 2 * sd));
free_shm();
}
-static void usage(const char *progname,
+static void usage(const char *progname,
/* Default params */
int algo, size_t size, int warmup, int l, int n)
{
- fprintf(stderr, "SHA performance testing tool for OP-TEE (%s)\n\n",
- TO_STR(VERSION));
+ fprintf(stderr, "SHA performance testing tool for OP-TEE\n\n");
fprintf(stderr, "Usage:\n");
fprintf(stderr, " %s -h\n", progname);
fprintf(stderr, " %s [-v] [-a algo] ", progname);
@@ -395,7 +398,7 @@ static void usage(const char *progname,
do { \
if (++i == argc) { \
fprintf(stderr, "%s: %s: missing argument\n", \
- argv[0], argv[i-1]); \
+ argv[0], argv[i - 1]); \
return 1; \
} \
} while (0);
@@ -405,7 +408,6 @@ static void usage(const char *progname,
extern int sha_perf_runner_cmd_parser(int argc, char *argv[])
{
int i;
-
/* Command line params */
size_t size = 1024; /* Buffer size (-s) */
unsigned int n = CRYPTO_DEF_COUNT;/* Number of measurements (-n)*/
@@ -418,7 +420,6 @@ extern int sha_perf_runner_cmd_parser(int argc, char *argv[])
int warmup = CRYPTO_DEF_WARMUP;
int offset = 0; /* Buffer offset wrt. alloc'ed address (-u) */
-
/* Parse command line */
for (i = 1; i < argc; i++) {
if (!strcmp(argv[i], "-h")) {
@@ -470,7 +471,7 @@ extern int sha_perf_runner_cmd_parser(int argc, char *argv[])
return 1;
}
}
-
+
sha_perf_run_test(algo, size, n, l, random_in, offset, warmup, verbosity);
return 0;
diff --git a/demos/optee_test/host/xtest/sock_server.c b/demos/optee_test/host/xtest/sock_server.c
new file mode 100644
index 0000000..0d2ff06
--- a/dev/null
+++ b/demos/optee_test/host/xtest/sock_server.c
@@ -0,0 +1,407 @@
+/*
+ * Copyright (c) 2016, Linaro Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License Version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <sys/types.h>
+#include <stdbool.h>
+#include <arpa/inet.h>
+#include <err.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <poll.h>
+#include <sys/errno.h>
+#include <sys/socket.h>
+#include <unistd.h>
+
+#include "sock_server.h"
+
+struct server_state {
+ struct sock_state *socks;
+ struct pollfd *fds;
+ nfds_t nfds;
+ bool got_quit;
+ struct sock_io_cb *cb;
+};
+
+#define SOCK_BUF_SIZE 512
+
+struct sock_state {
+ bool (*cb)(struct server_state *srvst, size_t idx);
+ struct sock_server_bind *serv;
+};
+
+static bool server_io_cb(struct server_state *srvst, size_t idx)
+{
+ short revents = srvst->fds[idx].revents;
+ short *events = &srvst->fds[idx].events;
+ struct sock_io_cb *cb = srvst->cb;
+ int fd;
+
+ fd = srvst->fds[idx].fd;
+ if (revents & POLLIN) {
+ if (!cb->read)
+ *events &= ~POLLIN;
+ else if (!cb->read(cb->ptr, fd, events))
+ goto close;
+ }
+
+ if (revents & POLLOUT) {
+ if (!cb->write)
+ *events &= ~POLLOUT;
+ else if (!cb->write(cb->ptr, fd, events))
+ goto close;
+ }
+
+ if (!(revents & ~(POLLIN | POLLOUT)))
+ return true;
+close:
+ if (close(fd)) {
+ warn("server_io_cb: close(%d)", fd);
+ return false;
+ }
+ srvst->fds[idx].fd = -1;
+ return true;
+}
+
+static bool server_add_state(struct server_state *srvst,
+ bool (*cb)(struct server_state *srvst, size_t idx),
+ struct sock_server_bind *serv, int fd,
+ short poll_events)
+{
+ void *p;
+ size_t n;
+
+ for (n = 0; n < srvst->nfds; n++) {
+ if (srvst->fds[n].fd == -1) {
+ srvst->socks[n].cb = cb;
+ srvst->socks[n].serv = serv;
+ srvst->fds[n].fd = fd;
+ srvst->fds[n].events = poll_events;
+ srvst->fds[n].revents = 0;
+ return true;
+ }
+ }
+
+ p = realloc(srvst->socks, sizeof(*srvst->socks) * (srvst->nfds + 1));
+ if (!p)
+ return false;
+ srvst->socks = p;
+ srvst->socks[srvst->nfds].cb = cb;
+ srvst->socks[srvst->nfds].serv = serv;
+
+ p = realloc(srvst->fds, sizeof(*srvst->fds) * (srvst->nfds + 1));
+ if (!p)
+ return false;
+ srvst->fds = p;
+ srvst->fds[srvst->nfds].fd = fd;
+ srvst->fds[srvst->nfds].events = poll_events;
+ srvst->fds[srvst->nfds].revents = 0;
+
+ srvst->nfds++;
+ return true;
+}
+
+static bool tcp_server_accept_cb(struct server_state *srvst, size_t idx)
+{
+ short revents = srvst->fds[idx].revents;
+ struct sockaddr_storage sass;
+ struct sockaddr *sa = (struct sockaddr *)&sass;
+ socklen_t len = sizeof(sass);
+ int fd;
+ short io_events = POLLIN | POLLOUT;
+
+ if (!(revents & POLLIN))
+ return false;
+
+ fd = accept(srvst->fds[idx].fd, sa, &len);
+ if (fd == -1) {
+ if (errno == EAGAIN || errno == EWOULDBLOCK ||
+ errno == ECONNABORTED)
+ return true;
+ return false;
+ }
+
+ if (srvst->cb->accept &&
+ !srvst->cb->accept(srvst->cb->ptr, fd, &io_events)) {
+ if (close(fd))
+ warn("server_accept_cb: close(%d)", fd);
+ return true;
+ }
+
+ return server_add_state(srvst, server_io_cb, srvst->socks[idx].serv,
+ fd, io_events);
+}
+
+static bool udp_server_cb(struct server_state *srvst, size_t idx)
+{
+ short revents = srvst->fds[idx].revents;
+
+ if (!(revents & POLLIN))
+ return false;
+
+ return srvst->cb->accept(srvst->cb->ptr, srvst->fds[idx].fd, NULL);
+}
+
+static bool server_quit_cb(struct server_state *srvst, size_t idx)
+{
+ (void)idx;
+ srvst->got_quit = true;
+ return true;
+}
+
+static void sock_server(struct sock_server *ts,
+ bool (*cb)(struct server_state *srvst, size_t idx))
+{
+ struct server_state srvst = { .cb = ts->cb };
+ int pres;
+ size_t n;
+ char b;
+
+ sock_server_lock(ts);
+
+ for (n = 0; n < ts->num_binds; n++) {
+ if (!server_add_state(&srvst, cb, ts->bind + n,
+ ts->bind[n].fd, POLLIN))
+ goto bad;
+ }
+
+ if (!server_add_state(&srvst, server_quit_cb, NULL,
+ ts->quit_fd, POLLIN))
+ goto bad;
+
+ while (true) {
+ sock_server_unlock(ts);
+ /*
+ * First sleep 5 ms to make it easier to test send timeouts
+ * due to this rate limit.
+ */
+ poll(NULL, 0, 5);
+ pres = poll(srvst.fds, srvst.nfds, -1);
+ sock_server_lock(ts);
+ if (pres < 0)
+ goto bad;
+
+ for (n = 0; pres && n < srvst.nfds; n++) {
+ if (srvst.fds[n].revents) {
+ pres--;
+ if (!srvst.socks[n].cb(&srvst, n))
+ goto bad;
+ }
+ }
+
+ if (srvst.got_quit)
+ goto out;
+ }
+
+bad:
+ ts->error = true;
+out:
+ for (n = 0; n < srvst.nfds; n++) {
+ /* Don't close accept and quit fds */
+ if (srvst.fds[n].fd != -1 && srvst.socks[n].serv &&
+ srvst.fds[n].fd != srvst.socks[n].serv->fd) {
+ if (close(srvst.fds[n].fd))
+ warn("sock_server: close(%d)", srvst.fds[n].fd);
+ }
+ }
+ free(srvst.socks);
+ free(srvst.fds);
+ if (read(ts->quit_fd, &b, 1) != 1)
+ ts->error = true;
+
+ sock_server_unlock(ts);
+}
+
+static void *sock_server_stream(void *arg)
+{
+ sock_server(arg, tcp_server_accept_cb);
+ return NULL;
+}
+
+static void *sock_server_dgram(void *arg)
+{
+ sock_server(arg, udp_server_cb);
+ return NULL;
+}
+
+static void sock_server_add_fd(struct sock_server *ts, struct addrinfo *ai)
+{
+ struct sock_server_bind serv;
+ struct sockaddr_storage sass;
+ struct sockaddr *sa = (struct sockaddr *)&sass;
+ struct sockaddr_in *sain = (struct sockaddr_in *)&sass;
+ struct sockaddr_in6 *sain6 = (struct sockaddr_in6 *)&sass;
+ void *src;
+ socklen_t len = sizeof(sass);
+ struct sock_server_bind *p;
+
+ memset(&serv, 0, sizeof(serv));
+
+ serv.fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+ if (serv.fd < 0)
+ return;
+
+ if (bind(serv.fd, ai->ai_addr, ai->ai_addrlen))
+ goto bad;
+
+ if (ai->ai_socktype == SOCK_STREAM && listen(serv.fd, 5))
+ goto bad;
+
+ if (getsockname(serv.fd, sa, &len))
+ goto bad;
+
+ switch (sa->sa_family) {
+ case AF_INET:
+ src = &sain->sin_addr;
+ serv.port = ntohs(sain->sin_port);
+ break;
+ case AF_INET6:
+ src = &sain6->sin6_addr;
+ serv.port = ntohs(sain6->sin6_port);
+ default:
+ goto bad;
+ }
+
+ if (!inet_ntop(sa->sa_family, src, serv.host, sizeof(serv.host)))
+ goto bad;
+
+ p = realloc(ts->bind, sizeof(*p) * (ts->num_binds + 1));
+ if (!p)
+ goto bad;
+
+ ts->bind = p;
+ p[ts->num_binds] = serv;
+ ts->num_binds++;
+ return;
+bad:
+ if (close(serv.fd))
+ warn("sock_server_add_fd: close(%d)", serv.fd);
+}
+
+void sock_server_uninit(struct sock_server *ts)
+{
+ size_t n;
+ int e;
+
+ if (ts->stop_fd != -1) {
+ if (close(ts->stop_fd))
+ warn("sock_server_uninit: close(%d)", ts->stop_fd);
+ ts->stop_fd = -1;
+ e = pthread_join(ts->thr, NULL);
+ if (e)
+ warnx("sock_server_uninit: pthread_join: %s",
+ strerror(e));
+ }
+
+ e = pthread_mutex_destroy(&ts->mu);
+ if (e)
+ warnx("sock_server_uninit: pthread_mutex_destroy: %s",
+ strerror(e));
+
+ for (n = 0; n < ts->num_binds; n++)
+ if (close(ts->bind[n].fd))
+ warn("sock_server_uninit: close(%d)", ts->bind[n].fd);
+ free(ts->bind);
+ if (ts->quit_fd != -1 && close(ts->quit_fd))
+ warn("sock_server_uninit: close(%d)", ts->quit_fd);
+ memset(ts, 0, sizeof(*ts));
+ ts->quit_fd = -1;
+ ts->stop_fd = -1;
+}
+
+static bool sock_server_init(struct sock_server *ts, struct sock_io_cb *cb,
+ int socktype)
+{
+ struct addrinfo hints;
+ struct addrinfo *ai;
+ struct addrinfo *ai0;
+ int fd_pair[2];
+ int e;
+
+ memset(ts, 0, sizeof(*ts));
+ ts->quit_fd = -1;
+ ts->stop_fd = -1;
+ ts->cb = cb;
+
+ e = pthread_mutex_init(&ts->mu, NULL);
+ if (e) {
+ warnx("sock_server_init: pthread_mutex_init: %s", strerror(e));
+ return false;
+ }
+
+ memset(&hints, 0, sizeof(hints));
+
+ hints.ai_flags = AI_PASSIVE;
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = socktype;
+
+ if (getaddrinfo(NULL, "0", &hints, &ai0))
+ return false;
+
+ for (ai = ai0; ai; ai = ai->ai_next)
+ sock_server_add_fd(ts, ai);
+
+ if (!ts->num_binds)
+ return false;
+
+ if (pipe(fd_pair)) {
+ sock_server_uninit(ts);
+ return false;
+ }
+
+ ts->quit_fd = fd_pair[0];
+
+ if (socktype == SOCK_STREAM)
+ e = pthread_create(&ts->thr, NULL, sock_server_stream, ts);
+ else
+ e = pthread_create(&ts->thr, NULL, sock_server_dgram, ts);
+ if (e) {
+ warnx("sock_server_init: pthread_create: %s", strerror(e));
+ if (close(fd_pair[1]))
+ warn("sock_server_init: close(%d)", fd_pair[1]);
+ sock_server_uninit(ts);
+ return false;
+ }
+
+ ts->stop_fd = fd_pair[1];
+ return true;
+}
+
+bool sock_server_init_tcp(struct sock_server *sock_serv, struct sock_io_cb *cb)
+{
+ return sock_server_init(sock_serv, cb, SOCK_STREAM);
+}
+
+bool sock_server_init_udp(struct sock_server *sock_serv, struct sock_io_cb *cb)
+{
+ return sock_server_init(sock_serv, cb, SOCK_DGRAM);
+}
+
+void sock_server_lock(struct sock_server *ts)
+{
+ int e = pthread_mutex_lock(&ts->mu);
+
+ if (e)
+ errx(1, "sock_server_lock: pthread_mutex_lock: %s", strerror(e));
+}
+
+void sock_server_unlock(struct sock_server *ts)
+{
+ int e = pthread_mutex_unlock(&ts->mu);
+
+ if (e)
+ errx(1, "sock_server_unlock: pthread_mutex_unlock: %s",
+ strerror(e));
+}
diff --git a/demos/optee_test/host/xtest/sock_server.h b/demos/optee_test/host/xtest/sock_server.h
new file mode 100644
index 0000000..bd91271
--- a/dev/null
+++ b/demos/optee_test/host/xtest/sock_server.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2016, Linaro Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License Version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef XTEST_SOCK_SERVER_H
+#define XTEST_SOCK_SERVER_H
+
+#include <pthread.h>
+#include <stdbool.h>
+#include <sys/types.h>
+
+struct sock_server_bind {
+ int fd;
+ char host[255];
+ int port;
+};
+
+struct sock_server {
+ struct sock_server_bind *bind;
+ size_t num_binds;
+ int quit_fd;
+ int stop_fd;
+ pthread_t thr;
+ pthread_mutex_t mu;
+ bool error;
+ struct sock_io_cb *cb;
+};
+
+struct sock_io_cb {
+ bool (*accept)(void *ptr, int fd, short *events);
+ bool (*read)(void *ptr, int fd, short *events);
+ bool (*write)(void *ptr, int fd, short *events);
+ void *ptr;
+};
+
+bool sock_server_init_tcp(struct sock_server *sock_serv, struct sock_io_cb *cb);
+bool sock_server_init_udp(struct sock_server *sock_serv, struct sock_io_cb *cb);
+void sock_server_uninit(struct sock_server *sock_serv);
+void sock_server_lock(struct sock_server *sock_serv);
+void sock_server_unlock(struct sock_server *sock_serv);
+
+#endif /*XTEST_SOCK_SERVER_H*/
diff --git a/demos/optee_test/host/xtest/xml/include/xml_client_api.h b/demos/optee_test/host/xtest/xml/include/xml_client_api.h
index 09ac263..2803239 100644
--- a/demos/optee_test/host/xtest/xml/include/xml_client_api.h
+++ b/demos/optee_test/host/xtest/xml/include/xml_client_api.h
@@ -14,6 +14,7 @@
#ifndef XML_CLIENT_API_H_
#define XML_CLIENT_API_H_
+#include <compiler.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
@@ -47,7 +48,7 @@ static uint32_t BIG_SIZE = 1024;
static uint32_t IGNORE = 0xFEFEFEFE;
static uint32_t VALUE01 = 0x01234567;
-static uint32_t VALUE02 = 0xFEDCBA98;
+static uint32_t VALUE02 __maybe_unused = 0xFEDCBA98;
static uint32_t SIZE_OVER_MEMORY = 0xFFFFFFFE;
static uint32_t SIZE_VALUE01 = sizeof(VALUE01);
static uint32_t ZERO;
@@ -58,7 +59,7 @@ static uint32_t ZERO;
#define TEEC_MEM_INOUT 0x00000003
/* "ItIsNotTotosTEEs" */
-const char *INVALID_NOT_EXISTING_TEE = "ItIsNotTotosTEEs\0";
+static const char *INVALID_NOT_EXISTING_TEE = "ItIsNotTotosTEEs\0";
/** ALL_TEMPORARY_MEMORIES */
uint8_t *TEMP_MEM01;
@@ -70,7 +71,7 @@ uint8_t *TEMP_MEM02;
* Trusted Applications
*/
/* "SMARTCSLTERRTOOS" */
-static TEEC_UUID UUID_TTA_answerErrorTo_OpenSession = {
+static TEEC_UUID UUID_TTA_answerErrorTo_OpenSession __maybe_unused = {
0x534D4152, 0x5443, 0x534C,
{ 0x54, 0x45, 0x52, 0x52, 0x54, 0x4F, 0x4F, 0x53 }
};
@@ -80,7 +81,7 @@ static TEEC_UUID UUID_TTA_answerSuccessTo_OpenSession_Invoke = {
{ 0x4C, 0x54, 0x2D, 0x54, 0x41, 0x2D, 0x53, 0x55 }
};
/* "SMARTCSLTOS4PARM" */
-static TEEC_UUID UUID_TTA_check_OpenSession_with_4_parameters = {
+static TEEC_UUID UUID_TTA_check_OpenSession_with_4_parameters __maybe_unused = {
0x534D4152, 0x5443, 0x534C,
{ 0x54, 0x4F, 0x53, 0x34, 0x50, 0x41, 0x52, 0x4D }
};
@@ -172,9 +173,10 @@ static TEEC_Result RegisterSharedMemory(TEEC_Context *ctx,
/* Assigns a and b to the value parameter */
-static void TEEC_prepare_OperationEachParameter_value(TEEC_Operation *op,
- size_t n, uint32_t a,
- uint32_t b)
+static inline void TEEC_prepare_OperationEachParameter_value(TEEC_Operation *op,
+ size_t n,
+ uint32_t a,
+ uint32_t b)
{
if (IGNORE != a)
op->params[n].value.a = a;
diff --git a/demos/optee_test/host/xtest/xtest_helpers.c b/demos/optee_test/host/xtest/xtest_helpers.c
index 7a91acd..879bf48 100644
--- a/demos/optee_test/host/xtest/xtest_helpers.c
+++ b/demos/optee_test/host/xtest/xtest_helpers.c
@@ -11,16 +11,17 @@
* GNU General Public License for more details.
*/
-#include "xtest_helpers.h"
-#include "xtest_test.h"
-
+#include <assert.h>
+#include <err.h>
+#include <malloc.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <string.h>
#include <ta_crypt.h>
#include <utee_defines.h>
-#include <string.h>
-#include <stdio.h>
-#include <malloc.h>
-#include <assert.h>
+#include "xtest_helpers.h"
+#include "xtest_test.h"
/* Round up the even multiple of size, size has to be a multiple of 2 */
#define ROUNDUP(v, size) (((v) + (size - 1)) & ~(size - 1))
@@ -408,3 +409,61 @@ int ree_fs_get_ta_dirname(TEEC_UUID *p_uuid, char *buffer, uint32_t len)
p_uuid->clockSeqAndNode[6],
p_uuid->clockSeqAndNode[7]);
}
+
+
+void xtest_mutex_init(pthread_mutex_t *mutex)
+{
+ int e = pthread_mutex_init(mutex, NULL);
+
+ if (e)
+ errx(1, "pthread_mutex_init: %s", strerror(e));
+}
+
+void xtest_mutex_destroy(pthread_mutex_t *mutex)
+{
+ int e = pthread_mutex_destroy(mutex);
+
+ if (e)
+ errx(1, "pthread_mutex_destroy: %s", strerror(e));
+}
+
+void xtest_mutex_lock(pthread_mutex_t *mutex)
+{
+ int e = pthread_mutex_lock(mutex);
+
+ if (e)
+ errx(1, "pthread_mutex_lock: %s", strerror(e));
+}
+
+void xtest_mutex_unlock(pthread_mutex_t *mutex)
+{
+ int e = pthread_mutex_unlock(mutex);
+
+ if (e)
+ errx(1, "pthread_mutex_unlock: %s", strerror(e));
+}
+
+void xtest_barrier_init(pthread_barrier_t *barrier, unsigned count)
+{
+ int e = pthread_barrier_init(barrier, NULL, count);
+
+ if (e)
+ errx(1, "pthread_barrier_init: %s", strerror(e));
+}
+
+void xtest_barrier_destroy(pthread_barrier_t *barrier)
+{
+ int e = pthread_barrier_destroy(barrier);
+
+ if (e)
+ errx(1, "pthread_barrier_destroy: %s", strerror(e));
+}
+
+int xtest_barrier_wait(pthread_barrier_t *barrier)
+{
+ int e = pthread_barrier_wait(barrier);
+
+ if (e && e != PTHREAD_BARRIER_SERIAL_THREAD)
+ errx(1, "pthread _barrier_wait: %s", strerror(e));
+ return e;
+}
diff --git a/demos/optee_test/host/xtest/xtest_helpers.h b/demos/optee_test/host/xtest/xtest_helpers.h
index 2339db2..66d372c 100644
--- a/demos/optee_test/host/xtest/xtest_helpers.h
+++ b/demos/optee_test/host/xtest/xtest_helpers.h
@@ -14,9 +14,10 @@
#ifndef XTEST_HELPERS_H
#define XTEST_HELPERS_H
-#include <tee_client_api.h>
-#include <tee_api_types.h>
#include <adbg.h>
+#include <pthread.h>
+#include <tee_api_types.h>
+#include <tee_client_api.h>
extern unsigned int level;
@@ -103,4 +104,13 @@ TEE_Result pack_attrs(const TEE_Attribute *attrs, uint32_t attr_count,
int ree_fs_get_ta_dirname(TEEC_UUID *p_uuid, char *buffer, uint32_t len);
+void xtest_mutex_init(pthread_mutex_t *mutex);
+void xtest_mutex_destroy(pthread_mutex_t *mutex);
+void xtest_mutex_lock(pthread_mutex_t *mutex);
+void xtest_mutex_unlock(pthread_mutex_t *mutex);
+
+void xtest_barrier_init(pthread_barrier_t *barrier, unsigned count);
+void xtest_barrier_destroy(pthread_barrier_t *barrier);
+int xtest_barrier_wait(pthread_barrier_t *barrier);
+
#endif /*XTEST_HELPERS_H*/
diff --git a/demos/optee_test/host/xtest/xtest_main.c b/demos/optee_test/host/xtest/xtest_main.c
index a68202f..c35ac7c 100644
--- a/demos/optee_test/host/xtest/xtest_main.c
+++ b/demos/optee_test/host/xtest/xtest_main.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (c) 2016, Linaro Limited
* Copyright (c) 2014, STMicroelectronics International N.V.
*
* This program is free software; you can redistribute it and/or modify
@@ -11,6 +12,9 @@
* GNU General Public License for more details.
*/
+#include <err.h>
+#include <inttypes.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -23,120 +27,21 @@
/* include here shandalone tests */
#include "crypto_common.h"
-#ifdef WITH_GP_TESTS
-#include "adbg_entry_declare.h"
-#endif
-ADBG_SUITE_DECLARE(XTEST_TEE_TEST)
-
-/*ADBG Suite definition.*/
-ADBG_SUITE_DEFINE_BEGIN(XTEST_TEE_TEST)
-ADBG_SUITE_ENTRY(XTEST_TEE_1001)
-ADBG_SUITE_ENTRY(XTEST_TEE_1004)
-ADBG_SUITE_ENTRY(XTEST_TEE_1005)
-ADBG_SUITE_ENTRY(XTEST_TEE_1006)
-ADBG_SUITE_ENTRY(XTEST_TEE_1007)
-ADBG_SUITE_ENTRY(XTEST_TEE_1008)
-ADBG_SUITE_ENTRY(XTEST_TEE_1009)
-ADBG_SUITE_ENTRY(XTEST_TEE_1010)
-ADBG_SUITE_ENTRY(XTEST_TEE_1011)
-ADBG_SUITE_ENTRY(XTEST_TEE_1012)
-ADBG_SUITE_ENTRY(XTEST_TEE_1013)
-ADBG_SUITE_ENTRY(XTEST_TEE_4001)
-ADBG_SUITE_ENTRY(XTEST_TEE_4002)
-ADBG_SUITE_ENTRY(XTEST_TEE_4003_NO_XTS)
-ADBG_SUITE_ENTRY(XTEST_TEE_4003_XTS)
-ADBG_SUITE_ENTRY(XTEST_TEE_4004)
-ADBG_SUITE_ENTRY(XTEST_TEE_4005)
-ADBG_SUITE_ENTRY(XTEST_TEE_4006)
-ADBG_SUITE_ENTRY(XTEST_TEE_4007)
-ADBG_SUITE_ENTRY(XTEST_TEE_4008)
-ADBG_SUITE_ENTRY(XTEST_TEE_4009)
-ADBG_SUITE_ENTRY(XTEST_TEE_4010)
-ADBG_SUITE_ENTRY(XTEST_TEE_4011)
-ADBG_SUITE_ENTRY(XTEST_TEE_5006)
-ADBG_SUITE_ENTRY(XTEST_TEE_6001)
-ADBG_SUITE_ENTRY(XTEST_TEE_6002)
-ADBG_SUITE_ENTRY(XTEST_TEE_6003)
-ADBG_SUITE_ENTRY(XTEST_TEE_6004)
-ADBG_SUITE_ENTRY(XTEST_TEE_6005)
-ADBG_SUITE_ENTRY(XTEST_TEE_6006)
-ADBG_SUITE_ENTRY(XTEST_TEE_6007)
-ADBG_SUITE_ENTRY(XTEST_TEE_6008)
-ADBG_SUITE_ENTRY(XTEST_TEE_6009)
-ADBG_SUITE_ENTRY(XTEST_TEE_6010)
-#ifdef WITH_GP_TESTS
-ADBG_SUITE_ENTRY(XTEST_TEE_6011)
-#endif
-ADBG_SUITE_ENTRY(XTEST_TEE_6012)
-ADBG_SUITE_ENTRY(XTEST_TEE_6013)
-ADBG_SUITE_ENTRY(XTEST_TEE_6014)
-ADBG_SUITE_ENTRY(XTEST_TEE_6015)
-ADBG_SUITE_ENTRY(XTEST_TEE_6016)
-ADBG_SUITE_ENTRY(XTEST_TEE_6017)
-ADBG_SUITE_ENTRY(XTEST_TEE_7001)
-ADBG_SUITE_ENTRY(XTEST_TEE_7002)
-ADBG_SUITE_ENTRY(XTEST_TEE_7003)
-ADBG_SUITE_ENTRY(XTEST_TEE_7004)
-ADBG_SUITE_ENTRY(XTEST_TEE_7005)
-ADBG_SUITE_ENTRY(XTEST_TEE_7006)
-ADBG_SUITE_ENTRY(XTEST_TEE_7007)
-ADBG_SUITE_ENTRY(XTEST_TEE_7008)
-ADBG_SUITE_ENTRY(XTEST_TEE_7009)
-ADBG_SUITE_ENTRY(XTEST_TEE_7010)
-ADBG_SUITE_ENTRY(XTEST_TEE_7013)
-ADBG_SUITE_ENTRY(XTEST_TEE_7016)
-ADBG_SUITE_ENTRY(XTEST_TEE_7017)
-ADBG_SUITE_ENTRY(XTEST_TEE_7018)
-ADBG_SUITE_ENTRY(XTEST_TEE_7019)
+ADBG_SUITE_DEFINE(benchmark);
#ifdef WITH_GP_TESTS
-ADBG_ENTRY_AUTO_GENERATED_TESTS()
+ADBG_SUITE_DEFINE(gp);
#endif
-ADBG_SUITE_ENTRY(XTEST_TEE_10001)
-ADBG_SUITE_ENTRY(XTEST_TEE_10002)
-
-#if defined(CFG_REE_FS)
-ADBG_SUITE_ENTRY(XTEST_TEE_20001)
-ADBG_SUITE_ENTRY(XTEST_TEE_20002)
-ADBG_SUITE_ENTRY(XTEST_TEE_20003)
-ADBG_SUITE_ENTRY(XTEST_TEE_20004)
-ADBG_SUITE_ENTRY(XTEST_TEE_20021)
-ADBG_SUITE_ENTRY(XTEST_TEE_20022)
-ADBG_SUITE_ENTRY(XTEST_TEE_20023)
-
-ADBG_SUITE_ENTRY(XTEST_TEE_20501)
-ADBG_SUITE_ENTRY(XTEST_TEE_20502)
-ADBG_SUITE_ENTRY(XTEST_TEE_20503)
-ADBG_SUITE_ENTRY(XTEST_TEE_20521)
-ADBG_SUITE_ENTRY(XTEST_TEE_20522)
-ADBG_SUITE_ENTRY(XTEST_TEE_20523)
-#endif /* defined(CFG_REE_FS) */
-
-ADBG_SUITE_DEFINE_END()
-
-
-ADBG_SUITE_DECLARE(XTEST_TEE_BENCHMARK)
-ADBG_SUITE_DEFINE_BEGIN(XTEST_TEE_BENCHMARK)
-
-/* Storage benchmarks */
-ADBG_SUITE_ENTRY(XTEST_TEE_BENCHMARK_1001)
-ADBG_SUITE_ENTRY(XTEST_TEE_BENCHMARK_1002)
-ADBG_SUITE_ENTRY(XTEST_TEE_BENCHMARK_1003)
-
-/* SHA benchmarks */
-ADBG_SUITE_ENTRY(XTEST_TEE_BENCHMARK_2001)
-ADBG_SUITE_ENTRY(XTEST_TEE_BENCHMARK_2002)
-
-/* AES benchmarks */
-ADBG_SUITE_ENTRY(XTEST_TEE_BENCHMARK_2011)
-ADBG_SUITE_ENTRY(XTEST_TEE_BENCHMARK_2012)
-ADBG_SUITE_DEFINE_END()
-
+ADBG_SUITE_DEFINE(regression);
char *_device = NULL;
unsigned int level = 0;
static const char glevel[] = "0";
-static const char gsuitename[] = "regression";
+#ifdef WITH_GP_TESTS
+static char gsuitename[] = "regression+gp";
+#else
+static char gsuitename[] = "regression";
+#endif
void usage(char *program);
@@ -145,34 +50,55 @@ void usage(char *program)
printf("Usage: %s <options> <test_id>\n", program);
printf("\n");
printf("options:\n");
- printf("\t-d <device-type> default not set, use any\n");
- printf("\t-l <level> test suite level: [0-15]\n");
- printf("\t-t <test_suite> available test suite: regression, benchmark\n");
- printf("\t default value = %s\n", gsuitename);
- printf("\t-h show usage\n");
- printf("applets:\n");
- printf("\t--sha-perf SHA performance testing tool for OP-TEE\n");
- printf("\t--sha perf -h show usage of SHA performance testing tool\n");
+ printf("\t-d <device-type> TEE device path. Default not set (use any)\n");
+ printf("\t-l <level> Test level [0-15]. Values higher than 0 enable\n");
+ printf("\t optional tests. Default: 0. All tests: 15.\n");
+ printf("\t-t <test_suite> Available test suites: regression benchmark");
+#ifdef WITH_GP_TESTS
+ printf(" gp");
+#endif
printf("\n");
- printf("\t--aes-perf AES performance testing tool for OP-TEE\n");
- printf("\t--aes perf -h show usage of AES performance testing tool\n");
+ printf("\t To run several suites, use multiple names\n");
+ printf("\t separated by a '+')\n");
+ printf("\t Default value: '%s'\n", gsuitename);
+ printf("\t-h Show usage\n");
+ printf("applets:\n");
+ printf("\t--sha-perf [opts] SHA performance testing tool (-h for usage)\n");
+ printf("\t--aes-perf [opts] AES performance testing tool (-h for usage)\n");
+#ifdef CFG_SECURE_DATA_PATH
+ printf("\t--sdp-basic [opts] Basic Secure Data Path test setup ('-h' for usage)\n");
+#endif
printf("\n");
}
int main(int argc, char *argv[])
{
int opt;
- int idx;
+ int index;
+ TEEC_Result tee_res;
int ret;
char *p = (char *)glevel;
char *test_suite = (char *)gsuitename;
+ char *token;
+ ADBG_Suite_Definition_t all = { .SuiteID_p = NULL,
+ .cases = TAILQ_HEAD_INITIALIZER(all.cases), };
opterr = 0;
+ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
+ warn("signal(SIGPIPE, SIG_IGN)");
+
+ if (signal(SIGHUP, SIG_IGN) == SIG_ERR)
+ warn("signal(SIGPIPE, SIG_IGN)");
+
if (argc > 1 && !strcmp(argv[1], "--sha-perf"))
return sha_perf_runner_cmd_parser(argc-1, &argv[1]);
else if (argc > 1 && !strcmp(argv[1], "--aes-perf"))
return aes_perf_runner_cmd_parser(argc-1, &argv[1]);
+#ifdef CFG_SECURE_DATA_PATH
+ else if (argc > 1 && !strcmp(argv[1], "--sdp-basic"))
+ return sdp_basic_runner_cmd_parser(argc-1, &argv[1]);
+#endif
while ((opt = getopt(argc, argv, "d:l:t:h")) != -1)
switch (opt) {
@@ -193,8 +119,8 @@ int main(int argc, char *argv[])
return -1;
}
- for (idx = optind; idx < argc; idx++)
- printf("Test ID: %s\n", argv[idx]);
+ for (index = optind; index < argc; index++)
+ printf("Test ID: %s\n", argv[index]);
if (p)
level = atoi(p);
@@ -204,17 +130,41 @@ int main(int argc, char *argv[])
printf("\nTEE test application started with device [%s]\n", _device);
- xtest_teec_ctx_init();
+ tee_res = xtest_teec_ctx_init();
+ if (tee_res != TEEC_SUCCESS) {
+ fprintf(stderr, "Failed to open TEE context: 0x%" PRIx32 "\n",
+ tee_res);
+ return -1;
+ }
+
+ /* Concatenate all the selected suites into 'all' */
+ for (token = test_suite; ; token = NULL) {
+
+ token = strtok(token, "+");
+ if (!token)
+ break;
- if (strcmp(test_suite, "regression") == 0)
- ret = Do_ADBG_RunSuite(&ADBG_Suite_XTEST_TEE_TEST, argc - optind, (argv + optind));
- else if (strcmp(test_suite, "benchmark") == 0)
- ret = Do_ADBG_RunSuite(&ADBG_Suite_XTEST_TEE_BENCHMARK, argc - optind, (argv + optind));
- else {
- fprintf(stderr, "No test suite found: %s\n", test_suite);
- ret = -1;
+ if (!strcmp(token, "regression"))
+ ret = Do_ADBG_AppendToSuite(&all, &ADBG_Suite_regression);
+ else if (!strcmp(token, "benchmark"))
+ ret = Do_ADBG_AppendToSuite(&all, &ADBG_Suite_benchmark);
+#ifdef WITH_GP_TESTS
+ else if (!strcmp(token, "gp"))
+ ret = Do_ADBG_AppendToSuite(&all, &ADBG_Suite_gp);
+#endif
+ else {
+ fprintf(stderr, "Unkown test suite: %s\n", token);
+ ret = -1;
+ }
+ if (ret < 0)
+ goto err;
}
+ /* Run the tests */
+ ret = Do_ADBG_RunSuite(&all, argc - optind, argv + optind);
+
+err:
+ free((void *)all.SuiteID_p);
xtest_teec_ctx_deinit();
printf("TEE test application done!\n");
diff --git a/demos/optee_test/host/xtest/xtest_test.c b/demos/optee_test/host/xtest/xtest_test.c
index fa0d214..95f2ac8 100644
--- a/demos/optee_test/host/xtest/xtest_test.c
+++ b/demos/optee_test/host/xtest/xtest_test.c
@@ -12,6 +12,7 @@
*/
#include "xtest_test.h"
+#include <pta_invoke_tests.h>
#include <tee_client_api.h>
#include <ta_create_fail_test.h>
#include <ta_crypt.h>
@@ -23,7 +24,12 @@
#include <ta_concurrent_large.h>
#include <enc_fs_key_manager_test.h>
#include <ta_storage_benchmark.h>
+#include <ta_socket.h>
#include <tee_api_defines.h>
+#include <__tee_isocket_defines.h>
+#include <__tee_tcpsocket_defines.h>
+#include <__tee_udpsocket_defines.h>
+#include <ta_sdp_basic.h>
#ifdef WITH_GP_TESTS
#include <tee_api_types.h>
#include <TTA_DS_protocol.h>
@@ -59,7 +65,15 @@ ADBG_ENUM_TABLE_ENTRY(TEE_ERROR_STORAGE_NO_SPACE),
ADBG_ENUM_TABLE_ENTRY(TEE_ERROR_MAC_INVALID),
ADBG_ENUM_TABLE_ENTRY(TEE_ERROR_SIGNATURE_INVALID),
ADBG_ENUM_TABLE_ENTRY(TEE_ERROR_TIME_NOT_SET),
-ADBG_ENUM_TABLE_ENTRY(TEE_ERROR_TIME_NEEDS_RESET)
+ADBG_ENUM_TABLE_ENTRY(TEE_ERROR_TIME_NEEDS_RESET),
+ADBG_ENUM_TABLE_ENTRY(TEE_ISOCKET_ERROR_PROTOCOL),
+ADBG_ENUM_TABLE_ENTRY(TEE_ISOCKET_ERROR_REMOTE_CLOSED),
+ADBG_ENUM_TABLE_ENTRY(TEE_ISOCKET_ERROR_TIMEOUT),
+ADBG_ENUM_TABLE_ENTRY(TEE_ISOCKET_ERROR_OUT_OF_RESOURCES),
+ADBG_ENUM_TABLE_ENTRY(TEE_ISOCKET_ERROR_LARGE_BUFFER),
+ADBG_ENUM_TABLE_ENTRY(TEE_ISOCKET_WARNING_PROTOCOL),
+ADBG_ENUM_TABLE_ENTRY(TEE_ISOCKET_ERROR_HOSTNAME),
+ADBG_ENUM_TABLE_ENTRY(TEE_ISOCKET_UDP_WARNING_UNKNOWN_OUT_OF_BAND)
ADBG_ENUM_TABLE_DEFINE_END(TEEC_Result);
ADBG_ENUM_TABLE_DEFINE_BEGIN(TEEC_ErrorOrigin)
@@ -73,16 +87,11 @@ ADBG_ENUM_TABLE_DEFINE_END(TEEC_ErrorOrigin);
{ 0xf34f4f3c, 0xab30, 0x4573, \
{ 0x91, 0xBF, 0x3C, 0x57, 0x02, 0x4D, 0x51, 0x99 } }
-#define STA_SELF_TEST_UUID \
- { 0xd96a5b40, 0xc3e5, 0x21e3, \
- { 0x87, 0x94, 0x10, 0x02, 0xa5, 0xd5, 0xc6, 0x1b } }
-
-
const TEEC_UUID crypt_user_ta_uuid = TA_CRYPT_UUID;
const TEEC_UUID os_test_ta_uuid = TA_OS_TEST_UUID;
const TEEC_UUID create_fail_test_ta_uuid = TA_CREATE_FAIL_TEST_UUID;
const TEEC_UUID ecc_test_ta_uuid = ECC_SELF_TEST_UUID;
-const TEEC_UUID sta_test_ta_uuid = STA_SELF_TEST_UUID;
+const TEEC_UUID pta_invoke_tests_ta_uuid = PTA_INVOKE_TESTS_UUID;
const TEEC_UUID rpc_test_ta_uuid = TA_RPC_TEST_UUID;
const TEEC_UUID sims_test_ta_uuid = TA_SIMS_TEST_UUID;
const TEEC_UUID storage_ta_uuid = TA_STORAGE_UUID;
@@ -91,6 +100,8 @@ const TEEC_UUID enc_fs_key_manager_test_ta_uuid = ENC_FS_KEY_MANAGER_TEST_UUID;
const TEEC_UUID concurrent_ta_uuid = TA_CONCURRENT_UUID;
const TEEC_UUID concurrent_large_ta_uuid = TA_CONCURRENT_LARGE_UUID;
const TEEC_UUID storage_benchmark_ta_uuid = TA_STORAGE_BENCHMARK_UUID;
+const TEEC_UUID socket_ta_uuid = TA_SOCKET_UUID;
+const TEEC_UUID sdp_basic_ta_uuid = TA_SDP_BASIC_UUID;
#ifdef WITH_GP_TESTS
const TEEC_UUID gp_tta_ds_uuid = TA_TTA_DS_UUID;
#endif
diff --git a/demos/optee_test/host/xtest/xtest_test.h b/demos/optee_test/host/xtest/xtest_test.h
index 5bdb5bc..49eccf8 100644
--- a/demos/optee_test/host/xtest/xtest_test.h
+++ b/demos/optee_test/host/xtest/xtest_test.h
@@ -1,4 +1,5 @@
/*
+ * Copyright (c) 2016, Linaro Limited
* Copyright (c) 2014, STMicroelectronics International N.V.
*
* This program is free software; you can redistribute it and/or modify
@@ -16,108 +17,11 @@
#include <adbg.h>
#include <tee_client_api.h>
-/*ADBG Cases declaration.*/
-ADBG_CASE_DECLARE(XTEST_TEE_1001);
-ADBG_CASE_DECLARE(XTEST_TEE_1004);
-ADBG_CASE_DECLARE(XTEST_TEE_1005);
-ADBG_CASE_DECLARE(XTEST_TEE_1006);
-ADBG_CASE_DECLARE(XTEST_TEE_1007);
-ADBG_CASE_DECLARE(XTEST_TEE_1008);
-ADBG_CASE_DECLARE(XTEST_TEE_1009);
-ADBG_CASE_DECLARE(XTEST_TEE_1010);
-ADBG_CASE_DECLARE(XTEST_TEE_1011);
-ADBG_CASE_DECLARE(XTEST_TEE_1012);
-ADBG_CASE_DECLARE(XTEST_TEE_1013);
-
-ADBG_CASE_DECLARE(XTEST_TEE_2001);
-ADBG_CASE_DECLARE(XTEST_TEE_2002);
-
-ADBG_CASE_DECLARE(XTEST_TEE_4001);
-ADBG_CASE_DECLARE(XTEST_TEE_4002);
-ADBG_CASE_DECLARE(XTEST_TEE_4003_NO_XTS);
-ADBG_CASE_DECLARE(XTEST_TEE_4003_XTS);
-ADBG_CASE_DECLARE(XTEST_TEE_4004);
-ADBG_CASE_DECLARE(XTEST_TEE_4005);
-ADBG_CASE_DECLARE(XTEST_TEE_4006);
-ADBG_CASE_DECLARE(XTEST_TEE_4007);
-ADBG_CASE_DECLARE(XTEST_TEE_4008);
-ADBG_CASE_DECLARE(XTEST_TEE_4009);
-ADBG_CASE_DECLARE(XTEST_TEE_4010);
-ADBG_CASE_DECLARE(XTEST_TEE_4011);
-
-ADBG_CASE_DECLARE(XTEST_TEE_5006);
-
-ADBG_CASE_DECLARE(XTEST_TEE_6001);
-ADBG_CASE_DECLARE(XTEST_TEE_6002);
-ADBG_CASE_DECLARE(XTEST_TEE_6003);
-ADBG_CASE_DECLARE(XTEST_TEE_6004);
-ADBG_CASE_DECLARE(XTEST_TEE_6005);
-ADBG_CASE_DECLARE(XTEST_TEE_6006);
-ADBG_CASE_DECLARE(XTEST_TEE_6007);
-ADBG_CASE_DECLARE(XTEST_TEE_6008);
-ADBG_CASE_DECLARE(XTEST_TEE_6009);
-ADBG_CASE_DECLARE(XTEST_TEE_6010);
+ADBG_SUITE_DECLARE(benchmark);
#ifdef WITH_GP_TESTS
-ADBG_CASE_DECLARE(XTEST_TEE_6011);
-#endif
-ADBG_CASE_DECLARE(XTEST_TEE_6012);
-ADBG_CASE_DECLARE(XTEST_TEE_6013);
-ADBG_CASE_DECLARE(XTEST_TEE_6014);
-ADBG_CASE_DECLARE(XTEST_TEE_6015);
-ADBG_CASE_DECLARE(XTEST_TEE_6016);
-ADBG_CASE_DECLARE(XTEST_TEE_6017);
-ADBG_CASE_DECLARE(XTEST_TEE_7001);
-ADBG_CASE_DECLARE(XTEST_TEE_7002);
-ADBG_CASE_DECLARE(XTEST_TEE_7003);
-ADBG_CASE_DECLARE(XTEST_TEE_7004);
-ADBG_CASE_DECLARE(XTEST_TEE_7005);
-ADBG_CASE_DECLARE(XTEST_TEE_7006);
-ADBG_CASE_DECLARE(XTEST_TEE_7007);
-ADBG_CASE_DECLARE(XTEST_TEE_7008);
-ADBG_CASE_DECLARE(XTEST_TEE_7009);
-ADBG_CASE_DECLARE(XTEST_TEE_7010);
-ADBG_CASE_DECLARE(XTEST_TEE_7013);
-ADBG_CASE_DECLARE(XTEST_TEE_7016);
-ADBG_CASE_DECLARE(XTEST_TEE_7017);
-ADBG_CASE_DECLARE(XTEST_TEE_7018);
-ADBG_CASE_DECLARE(XTEST_TEE_7019);
-
-ADBG_CASE_DECLARE(XTEST_TEE_10001);
-ADBG_CASE_DECLARE(XTEST_TEE_10002);
-
-#if defined(CFG_REE_FS)
-ADBG_CASE_DECLARE(XTEST_TEE_20001);
-ADBG_CASE_DECLARE(XTEST_TEE_20002);
-ADBG_CASE_DECLARE(XTEST_TEE_20003);
-ADBG_CASE_DECLARE(XTEST_TEE_20004);
-ADBG_CASE_DECLARE(XTEST_TEE_20021);
-ADBG_CASE_DECLARE(XTEST_TEE_20022);
-ADBG_CASE_DECLARE(XTEST_TEE_20023);
-
-ADBG_CASE_DECLARE(XTEST_TEE_20501);
-ADBG_CASE_DECLARE(XTEST_TEE_20502);
-ADBG_CASE_DECLARE(XTEST_TEE_20503);
-ADBG_CASE_DECLARE(XTEST_TEE_20521);
-ADBG_CASE_DECLARE(XTEST_TEE_20522);
-ADBG_CASE_DECLARE(XTEST_TEE_20523);
-#endif /* defined(CFG_REE_FS) */
-
-ADBG_CASE_DECLARE(XTEST_TEE_BENCHMARK_1001);
-ADBG_CASE_DECLARE(XTEST_TEE_BENCHMARK_1002);
-ADBG_CASE_DECLARE(XTEST_TEE_BENCHMARK_1003);
-
-/* SHA benchmarks */
-ADBG_CASE_DECLARE(XTEST_TEE_BENCHMARK_2001);
-ADBG_CASE_DECLARE(XTEST_TEE_BENCHMARK_2002);
-
-/* AES benchmarks */
-ADBG_CASE_DECLARE(XTEST_TEE_BENCHMARK_2011);
-ADBG_CASE_DECLARE(XTEST_TEE_BENCHMARK_2012);
-
-#ifdef WITH_GP_TESTS
-#include "adbg_case_declare.h"
-ADBG_CASE_DECLARE_AUTO_GENERATED_TESTS()
+ADBG_SUITE_DECLARE(gp);
#endif
+ADBG_SUITE_DECLARE(regression);
/* TEEC_Result */
ADBG_ENUM_TABLE_DECLARE(TEEC_Result);
@@ -220,11 +124,13 @@ extern const TEEC_UUID storage_ta_uuid;
extern const TEEC_UUID storage2_ta_uuid;
extern const TEEC_UUID enc_fs_key_manager_test_ta_uuid;
extern const TEEC_UUID ecc_test_ta_uuid;
-extern const TEEC_UUID sta_test_ta_uuid;
+extern const TEEC_UUID pta_invoke_tests_ta_uuid;
extern const TEEC_UUID gp_tta_time_uuid;
extern const TEEC_UUID concurrent_ta_uuid;
extern const TEEC_UUID concurrent_large_ta_uuid;
extern const TEEC_UUID storage_benchmark_ta_uuid;
+extern const TEEC_UUID socket_ta_uuid;
+extern const TEEC_UUID sdp_basic_ta_uuid;
extern char *_device;
#endif /*XTEST_TEST_H*/
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Arithmetical/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Arithmetical/code_files/sub.mk
index 72fba55..047bfc4 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Arithmetical/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Arithmetical/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_Arithmetical.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerErrorTo_Invoke/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerErrorTo_Invoke/code_files/sub.mk
index b0f90ef..784b879 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerErrorTo_Invoke/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerErrorTo_Invoke/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_answerErrorTo_Invoke.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerErrorTo_OpenSession/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerErrorTo_OpenSession/code_files/sub.mk
index 510999e..167747f 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerErrorTo_OpenSession/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerErrorTo_OpenSession/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_answerErrorTo_OpenSession.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerSuccessTo_OpenSession_Invoke/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerSuccessTo_OpenSession_Invoke/code_files/sub.mk
index 3618072..b2f4515 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerSuccessTo_OpenSession_Invoke/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_answerSuccessTo_OpenSession_Invoke/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_answerSuccessTo_OpenSession_Invoke.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_check_OpenSession_with_4_parameters/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_check_OpenSession_with_4_parameters/code_files/sub.mk
index 84237b0..a0c608c 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_check_OpenSession_with_4_parameters/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_check_OpenSession_with_4_parameters/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_check_OpenSession_with_4_parameters.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_testingClientAPI/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_testingClientAPI/code_files/sub.mk
index f8ad894..ae72363 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_testingClientAPI/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_ClientAPI/TTA_testingClientAPI/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_testingClientAPI.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Crypto/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Crypto/code_files/sub.mk
index 88870af..ffa3426 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Crypto/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Crypto/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_Crypto.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_DS/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_DS/code_files/sub.mk
index 2c4ebc0..69ff600 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_DS/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_DS/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_DS.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF/code_files/sub.mk
index 46de472..193cc71 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_TCF.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_ICA/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_ICA/code_files/sub.mk
index 9066247..8d28e1b 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_ICA/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_ICA/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_TCF_ICA.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_ICA2/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_ICA2/code_files/sub.mk
index 8190311..187fc97 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_ICA2/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_ICA2/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_TCF_ICA2.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_MultipleInstanceTA/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_MultipleInstanceTA/code_files/sub.mk
index 907b908..4b6fe04 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_MultipleInstanceTA/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_MultipleInstanceTA/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_TCF_MultipleInstanceTA.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_SingleInstanceTA/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_SingleInstanceTA/code_files/sub.mk
index ea7af3c..b1094da 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_SingleInstanceTA/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_TCF/TTA_TCF_SingleInstanceTA/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y += TTA_TCF_SingleInstanceTA.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Time/code_files/sub.mk b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Time/code_files/sub.mk
index 13f9579..c822c9e 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Time/code_files/sub.mk
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/TTAs/TTA_Time/code_files/sub.mk
@@ -1,2 +1,3 @@
global-incdirs-y += include
srcs-y +=TTA_Time.c
+cflags-y := -include ../include/GP_defs.h
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/host/xtest/xtest_9000.c.patch b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/host/xtest/xtest_9000.c.patch
deleted file mode 100644
index 1100067..0000000
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/host/xtest/xtest_9000.c.patch
+++ b/dev/null
@@ -1,142 +0,0 @@
---- xtest_9000.c.orig 2016-02-19 13:45:59.642478772 +0100
-+++ xtest_9000.c 2016-02-19 14:24:51.925965024 +0100
-@@ -958,8 +958,11 @@
- ADBG_EXPECT(c, TEEC_SUCCESS, TEEC_OpenSession(CONTEXT01, SESSION01, &UUID_TTA_testingInternalAPI_crypto, TEEC_LOGIN_PUBLIC, NULL, NULL, NULL));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_InitObjectWithKeys(c, SESSION01, CMD_InitObjectWithKeys, TEE_TYPE_HMAC_SHA256, SIZE_HMAC_SHA256_512, TEE_ATTR_SECRET_VALUE, TEE_ATTR_HMAC_SHA256_512_VALUE01, sizeof(TEE_ATTR_HMAC_SHA256_512_VALUE01), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), OBJECT_HANDLE_02));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_HMAC_SHA256, TEE_MODE_MAC, SIZE_HMAC_SHA256_512, SIZE_ZERO, OPERATION_HANDLE_01));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_GetOperationInfoMultiple(c, SESSION01, CMD_GetOperationInfoMultiple, OPERATION_HANDLE_01, TEE_ALG_HMAC_SHA256, TEE_OPERATION_MAC, TEE_MODE_MAC, SIZE_ZERO, SIZE_HMAC_SHA256_512, SIZE_ZERO, SIZE_ZERO, TEE_USAGE_MAC, 1, false, false, false));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey(c, SESSION01, CMD_SetOperationKey, OPERATION_HANDLE_01, OBJECT_HANDLE_02));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_GetOperationInfoMultiple(c, SESSION01, CMD_GetOperationInfoMultiple, OPERATION_HANDLE_01, TEE_ALG_HMAC_SHA256, TEE_OPERATION_MAC, TEE_MODE_MAC, SIZE_ZERO, SIZE_HMAC_SHA256_512, SIZE_ZERO, SIZE_HMAC_SHA256_512, TEE_USAGE_MAC, 1, false, true, false));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_MACInit(c, SESSION01, CMD_MACInit, OPERATION_HANDLE_01, NULL, IV_LENGTH_NULL));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_GetOperationInfoMultiple(c, SESSION01, CMD_GetOperationInfoMultiple, OPERATION_HANDLE_01, TEE_ALG_HMAC_SHA256, TEE_OPERATION_MAC, TEE_MODE_MAC, SIZE_ZERO, SIZE_HMAC_SHA256_512, SIZE_ZERO, SIZE_HMAC_SHA256_512, TEE_USAGE_MAC, 1, false, true, true));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_MACUpdate(c, SESSION01, CMD_MACUpdate, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1_PART1, LENGTH_DATA_FOR_CRYPTO1_PART1));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_ResetOperation(c, SESSION01, CMD_ResetOperation, OPERATION_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_GetOperationInfo(c, SESSION01, CMD_GetOperationInfo, OPERATION_HANDLE_01, TEE_ALG_HMAC_SHA256, TEE_OPERATION_MAC, TEE_MODE_MAC, SIZE_ZERO, SIZE_HMAC_SHA256_512, SIZE_ZERO, SIZE_HMAC_SHA256_512, TEE_USAGE_MAC, false, true, false));
-@@ -2148,7 +2151,8 @@
- ADBG_EXPECT(c, TEEC_SUCCESS, TEEC_InitializeContext(_device, CONTEXT01));
- ADBG_EXPECT(c, TEEC_SUCCESS, TEEC_OpenSession(CONTEXT01, SESSION01, &UUID_TTA_testingInternalAPI_crypto, TEEC_LOGIN_PUBLIC, NULL, NULL, NULL));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_MD5, TEE_MODE_DIGEST, SIZE_ZERO, SIZE_ZERO, OPERATION_HANDLE_02));
-- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_GetOperationInfo(c, SESSION01, CMD_GetOperationInfo, OPERATION_HANDLE_02, TEE_ALG_MD5, TEE_OPERATION_DIGEST, TEE_MODE_DIGEST, SIZE_ZERO, SIZE_ZERO, SIZE_ZERO, SIZE_ZERO, TEE_USAGE_NONE, false, true, false));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_GetOperationInfo(c, SESSION01, CMD_GetOperationInfo, OPERATION_HANDLE_02, TEE_ALG_MD5, TEE_OPERATION_DIGEST, TEE_MODE_DIGEST, SIZE_ZERO, SIZE_ZERO, SIZE_ZERO, SIZE_ZERO, TEE_USAGE_NONE, false, true, true));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_GetOperationInfoMultiple(c, SESSION01, CMD_GetOperationInfoMultiple, OPERATION_HANDLE_02, TEE_ALG_MD5, TEE_OPERATION_DIGEST, TEE_MODE_DIGEST, SIZE_ZERO, SIZE_ZERO, SIZE_ZERO, SIZE_ZERO, TEE_USAGE_NONE, 0, false, true, true));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_FreeAllKeysAndOperations(c, SESSION01, CMD_FreeAllKeysAndOperations, OPERATION_HANDLE_02));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-@@ -2626,7 +2630,7 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey(c, SESSION01, CMD_SetOperationKey, OPERATION_HANDLE_01, OBJECT_HANDLE_02));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricEncrypt(c, SESSION01, CMD_AsymmetricEncrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_MD5, TEE_MODE_DIGEST, SIZE_ZERO, SIZE_ZERO, OPERATION_HANDLE_02));
-- ADBG_EXPECT(c, TEE_ERROR_TARGET_DEAD, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_02, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
-+ ADBG_EXPECT(c, TEE_ERROR_TARGET_DEAD, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_02, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL, 1));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-
-@@ -2647,7 +2651,7 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_InitObjectWithKeys(c, SESSION01, CMD_InitObjectWithKeys, TEE_TYPE_RSA_KEYPAIR, SIZE_RSA_KEYPAIR_2048, TEE_ATTR_RSA_MODULUS, TEE_ATTR_RSA_MODULUS_VALUE01, sizeof(TEE_ATTR_RSA_MODULUS_VALUE01), TEE_ATTR_RSA_PUBLIC_EXPONENT, TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01), TEE_ATTR_RSA_PRIVATE_EXPONENT, TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), OBJECT_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, SIZE_RSA_KEYPAIR_2048, SIZE_ZERO, OPERATION_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey(c, SESSION01, CMD_SetOperationKey, OPERATION_HANDLE_01, OBJECT_HANDLE_01));
-- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL, 1));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_FreeAllKeysAndOperations(c, SESSION01, CMD_FreeAllKeysAndOperations, OPERATION_HANDLE_01));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-@@ -2669,7 +2673,7 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_InitObjectWithKeys(c, SESSION01, CMD_InitObjectWithKeys, TEE_TYPE_RSA_KEYPAIR, SIZE_RSA_KEYPAIR_2048, TEE_ATTR_RSA_MODULUS, TEE_ATTR_RSA_MODULUS_VALUE01, sizeof(TEE_ATTR_RSA_MODULUS_VALUE01), TEE_ATTR_RSA_PUBLIC_EXPONENT, TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01), TEE_ATTR_RSA_PRIVATE_EXPONENT, TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), OBJECT_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, SIZE_RSA_KEYPAIR_2048, SIZE_ZERO, OPERATION_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey(c, SESSION01, CMD_SetOperationKey, OPERATION_HANDLE_01, OBJECT_HANDLE_01));
-- ADBG_EXPECT(c, TEE_ERROR_TOO_SHORT_BUFFER, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_TOO_SHORT));
-+ ADBG_EXPECT(c, TEE_ERROR_TOO_SHORT_BUFFER, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_TOO_SHORT, 1));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_FreeAllKeysAndOperations(c, SESSION01, CMD_FreeAllKeysAndOperations, OPERATION_HANDLE_02));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-@@ -2688,7 +2692,7 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, SIZE_RSA_KEYPAIR_2048, SIZE_ZERO, OPERATION_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey(c, SESSION01, CMD_SetOperationKey, OPERATION_HANDLE_01, OBJECT_HANDLE_02));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricEncrypt(c, SESSION01, CMD_AsymmetricEncrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
-- ADBG_EXPECT(c, TEE_ERROR_TARGET_DEAD, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_INVALID, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
-+ ADBG_EXPECT(c, TEE_ERROR_TARGET_DEAD, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_INVALID, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL, 1));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-
-@@ -3466,7 +3470,7 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_InitObjectWithKeys(c, SESSION01, CMD_InitObjectWithKeys, TEE_TYPE_RSA_KEYPAIR, SIZE_RSA_KEYPAIR_2048, TEE_ATTR_RSA_MODULUS, TEE_ATTR_RSA_MODULUS_VALUE01, sizeof(TEE_ATTR_RSA_MODULUS_VALUE01), TEE_ATTR_RSA_PUBLIC_EXPONENT, TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01), TEE_ATTR_RSA_PRIVATE_EXPONENT, TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), OBJECT_HANDLE_02));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA224, TEE_MODE_DECRYPT, SIZE_RSA_KEYPAIR_2048, SIZE_ZERO, OPERATION_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey(c, SESSION01, CMD_SetOperationKey, OPERATION_HANDLE_01, OBJECT_HANDLE_02));
-- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL, 0));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_FreeAllKeysAndOperations(c, SESSION01, CMD_FreeAllKeysAndOperations, OPERATION_HANDLE_01));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-@@ -3488,7 +3492,7 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_InitObjectWithKeys(c, SESSION01, CMD_InitObjectWithKeys, TEE_TYPE_RSA_KEYPAIR, SIZE_RSA_KEYPAIR_2048, TEE_ATTR_RSA_MODULUS, TEE_ATTR_RSA_MODULUS_VALUE01, sizeof(TEE_ATTR_RSA_MODULUS_VALUE01), TEE_ATTR_RSA_PUBLIC_EXPONENT, TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01), TEE_ATTR_RSA_PRIVATE_EXPONENT, TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), OBJECT_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256, TEE_MODE_DECRYPT, SIZE_RSA_KEYPAIR_2048, SIZE_ZERO, OPERATION_HANDLE_02));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey(c, SESSION01, CMD_SetOperationKey, OPERATION_HANDLE_02, OBJECT_HANDLE_01));
-- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_02, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_02, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL, 0));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_FreeAllKeysAndOperations(c, SESSION01, CMD_FreeAllKeysAndOperations, OPERATION_HANDLE_02));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-@@ -3510,7 +3514,7 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_InitObjectWithKeys(c, SESSION01, CMD_InitObjectWithKeys, TEE_TYPE_RSA_KEYPAIR, SIZE_RSA_KEYPAIR_2048, TEE_ATTR_RSA_MODULUS, TEE_ATTR_RSA_MODULUS_VALUE01, sizeof(TEE_ATTR_RSA_MODULUS_VALUE01), TEE_ATTR_RSA_PUBLIC_EXPONENT, TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01), TEE_ATTR_RSA_PRIVATE_EXPONENT, TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), OBJECT_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA384, TEE_MODE_DECRYPT, SIZE_RSA_KEYPAIR_2048, SIZE_ZERO, OPERATION_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey(c, SESSION01, CMD_SetOperationKey, OPERATION_HANDLE_01, OBJECT_HANDLE_01));
-- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL, 0));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_FreeAllKeysAndOperations(c, SESSION01, CMD_FreeAllKeysAndOperations, OPERATION_HANDLE_01));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-@@ -3532,7 +3536,7 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_InitObjectWithKeys(c, SESSION01, CMD_InitObjectWithKeys, TEE_TYPE_RSA_KEYPAIR, SIZE_RSA_KEYPAIR_2048, TEE_ATTR_RSA_MODULUS, TEE_ATTR_RSA_MODULUS_VALUE01, sizeof(TEE_ATTR_RSA_MODULUS_VALUE01), TEE_ATTR_RSA_PUBLIC_EXPONENT, TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01), TEE_ATTR_RSA_PRIVATE_EXPONENT, TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), OBJECT_HANDLE_02));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA384, TEE_MODE_ENCRYPT, SIZE_RSA_KEYPAIR_2048, SIZE_ZERO, OPERATION_HANDLE_02));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey(c, SESSION01, CMD_SetOperationKey, OPERATION_HANDLE_02, OBJECT_HANDLE_02));
-- ADBG_EXPECT(c, TEE_ERROR_TARGET_DEAD, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_02, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
-+ ADBG_EXPECT(c, TEE_ERROR_TARGET_DEAD, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_02, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL, 0));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-
-@@ -3569,7 +3573,7 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_InitObjectWithKeys(c, SESSION01, CMD_InitObjectWithKeys, TEE_TYPE_RSA_KEYPAIR, SIZE_RSA_KEYPAIR_2048, TEE_ATTR_RSA_MODULUS, TEE_ATTR_RSA_MODULUS_VALUE01, sizeof(TEE_ATTR_RSA_MODULUS_VALUE01), TEE_ATTR_RSA_PUBLIC_EXPONENT, TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01), TEE_ATTR_RSA_PRIVATE_EXPONENT, TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), OBJECT_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA512, TEE_MODE_DECRYPT, SIZE_RSA_KEYPAIR_2048, SIZE_ZERO, OPERATION_HANDLE_02));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey(c, SESSION01, CMD_SetOperationKey, OPERATION_HANDLE_02, OBJECT_HANDLE_01));
-- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_02, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_02, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL, 0));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_FreeAllKeysAndOperations(c, SESSION01, CMD_FreeAllKeysAndOperations, OPERATION_HANDLE_02));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-@@ -3590,7 +3594,7 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricEncrypt(c, SESSION01, CMD_AsymmetricEncrypt, OPERATION_HANDLE_02, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_InitObjectWithKeys(c, SESSION01, CMD_InitObjectWithKeys, TEE_TYPE_RSA_KEYPAIR, SIZE_RSA_KEYPAIR_2048, TEE_ATTR_RSA_MODULUS, TEE_ATTR_RSA_MODULUS_VALUE01, sizeof(TEE_ATTR_RSA_MODULUS_VALUE01), TEE_ATTR_RSA_PUBLIC_EXPONENT, TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01), TEE_ATTR_RSA_PRIVATE_EXPONENT, TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), OBJECT_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA512, TEE_MODE_DECRYPT, SIZE_RSA_KEYPAIR_2048, SIZE_ZERO, OPERATION_HANDLE_01));
-- ADBG_EXPECT(c, TEE_ERROR_TARGET_DEAD, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
-+ ADBG_EXPECT(c, TEE_ERROR_TARGET_DEAD, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL, 0));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-
-@@ -3749,7 +3753,7 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_InitObjectWithKeys(c, SESSION01, CMD_InitObjectWithKeys, TEE_TYPE_RSA_KEYPAIR, SIZE_RSA_KEYPAIR_2048, TEE_ATTR_RSA_MODULUS, TEE_ATTR_RSA_MODULUS_VALUE01, sizeof(TEE_ATTR_RSA_MODULUS_VALUE01), TEE_ATTR_RSA_PUBLIC_EXPONENT, TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01), TEE_ATTR_RSA_PRIVATE_EXPONENT, TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), OBJECT_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1, TEE_MODE_DECRYPT, SIZE_RSA_KEYPAIR_2048, SIZE_ZERO, OPERATION_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey(c, SESSION01, CMD_SetOperationKey, OPERATION_HANDLE_01, OBJECT_HANDLE_01));
-- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL, 0));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_FreeAllKeysAndOperations(c, SESSION01, CMD_FreeAllKeysAndOperations, OPERATION_HANDLE_01));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-@@ -3771,7 +3775,7 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_InitObjectWithKeys(c, SESSION01, CMD_InitObjectWithKeys, TEE_TYPE_RSA_KEYPAIR, SIZE_RSA_KEYPAIR_2048, TEE_ATTR_RSA_MODULUS, TEE_ATTR_RSA_MODULUS_VALUE01, sizeof(TEE_ATTR_RSA_MODULUS_VALUE01), TEE_ATTR_RSA_PUBLIC_EXPONENT, TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PUBLIC_EXPONENT_VALUE01), TEE_ATTR_RSA_PRIVATE_EXPONENT, TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01, sizeof(TEE_ATTR_RSA_PRIVATE_EXPONENT_VALUE01), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), OBJECT_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT, SIZE_RSA_KEYPAIR_2048, SIZE_ZERO, OPERATION_HANDLE_01));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey(c, SESSION01, CMD_SetOperationKey, OPERATION_HANDLE_01, OBJECT_HANDLE_01));
-- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AsymmetricDecrypt(c, SESSION01, CMD_AsymmetricDecrypt, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1, LENGTH_DATA_FOR_CRYPTO1, OUTPUT_BUFFER_NORMAL, 0));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_FreeAllKeysAndOperations(c, SESSION01, CMD_FreeAllKeysAndOperations, OPERATION_HANDLE_01));
- TEEC_CloseSession(SESSION01);
- TEEC_FinalizeContext(CONTEXT01);
-@@ -4610,7 +4614,9 @@
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_InitObjectWithKeys(c, SESSION01, CMD_InitObjectWithKeys, TEE_TYPE_AES, SIZE_AES_256, TEE_ATTR_SECRET_VALUE, TEE_ATTR_AES_256_VALUE01, sizeof(TEE_ATTR_AES_256_VALUE01), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), TEE_ATTR_NONE, TEE_ATTR_VALUE_NONE, sizeof(TEE_ATTR_VALUE_NONE), OBJECT_HANDLE_02));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_AES_XTS, TEE_MODE_ENCRYPT, SIZE_AES_256, SIZE_AES_256, OPERATION_HANDLE_02));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_SetOperationKey2(c, SESSION01, CMD_SetOperationKey2, OPERATION_HANDLE_02, OBJECT_HANDLE_02, OBJECT_HANDLE_01));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_GetOperationInfoMultiple(c, SESSION01, CMD_GetOperationInfoMultiple, OPERATION_HANDLE_02, TEE_ALG_AES_XTS, TEE_OPERATION_CIPHER, TEE_MODE_ENCRYPT, SIZE_ZERO, SIZE_AES_256, SIZE_AES_256, SIZE_AES_256, TEE_USAGE_ENCRYPT, 2, true, true, false));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_AllocateOperation(c, SESSION01, CMD_AllocateOperation, TEE_ALG_AES_XTS, TEE_MODE_ENCRYPT, SIZE_AES_256, SIZE_AES_256, OPERATION_HANDLE_01));
-+ ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_GetOperationInfoMultiple(c, SESSION01, CMD_GetOperationInfoMultiple, OPERATION_HANDLE_01, TEE_ALG_AES_XTS, TEE_OPERATION_CIPHER, TEE_MODE_ENCRYPT, SIZE_ZERO, SIZE_AES_256, SIZE_AES_256, SIZE_ZERO, TEE_USAGE_ENCRYPT, 2, true, false, false));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_CopyOperation(c, SESSION01, CMD_CopyOperation, OPERATION_HANDLE_01, OPERATION_HANDLE_02));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_CipherInit(c, SESSION01, CMD_CipherInit, OPERATION_HANDLE_01, IV2_VALUE_128bits_AES, IV2_LENGTH_128bits_AES));
- ADBG_EXPECT(c, TEE_SUCCESS, Invoke_Crypto_CipherUpdate(c, SESSION01, CMD_CipherUpdate, OPERATION_HANDLE_01, DATA_FOR_CRYPTO1_PART1, LENGTH_DATA_FOR_CRYPTO1_PART1, OUTPUT_BUFFER_NORMAL));
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Adbg/xslstable/adbg_case_declare.xsl b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Adbg/xslstable/adbg_case_declare.xsl
deleted file mode 100644
index 0300bb7..0000000
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Adbg/xslstable/adbg_case_declare.xsl
+++ b/dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- Copyright (c) 2014, STMicroelectronics International N.V. -->
-<!-- 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. -->
-
-<xsl:stylesheet version="1.0"
-xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-<xsl:output method="text"/>
-<xsl:strip-space elements="*"/>
-<xsl:param name="target"/>
-<xsl:param name="f2" select="'TEE_DataStorage_API.xml'"/>
-<xsl:param name="f3" select="'TEE_Internal_API.xml'"/>
-<xsl:param name="f4" select="'TEE_TimeArithm_API.xml'"/>
-<xsl:param name="f5" select="'TEE_Crypto_API.xml'"/>
-<xsl:variable name="doc2" select="document($f2)"/>
-<xsl:variable name="doc3" select="document($f3)"/>
-<xsl:variable name="doc4" select="document($f4)"/>
-<xsl:variable name="doc5" select="document($f5)"/>
-
-<xsl:template match="package">
-<xsl:text>/*
- * Copyright (c) 2014, STMicroelectronics International N.V.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License Version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#ifndef ADBG_CASE_DECLARE_H
-#define ADBG_CASE_DECLARE_H
-
-#define ADBG_CASE_DECLARE_AUTO_GENERATED_TESTS() \
-</xsl:text>
-<xsl:for-each select="initial-state/scenario">
-<xsl:variable name="position" select="position()" />ADBG_CASE_DECLARE(XTEST_TEE_<xsl:value-of select="$position+7000" />);\
-</xsl:for-each>
-<xsl:text>\
-</xsl:text>
-<xsl:for-each select="$doc2/package/initial-state/scenario">
-<xsl:variable name="position" select="position()" />ADBG_CASE_DECLARE(XTEST_TEE_<xsl:value-of select="$position+7500" />);\
-</xsl:for-each>
-<xsl:text>\
-</xsl:text>
-<xsl:for-each select="$doc3/package/initial-state/scenario">
-<xsl:variable name="position" select="position()" />ADBG_CASE_DECLARE(XTEST_TEE_<xsl:value-of select="$position+8000" />);\
-</xsl:for-each>
-<xsl:text>\
-</xsl:text>
-<xsl:for-each select="$doc4/package/initial-state/scenario">
-<xsl:variable name="position" select="position()" />ADBG_CASE_DECLARE(XTEST_TEE_<xsl:value-of select="$position+8500" />);\
-</xsl:for-each>
-<xsl:text>\
-</xsl:text>
-<xsl:for-each select="$doc5/package/initial-state/scenario">
-<xsl:variable name="position" select="position()" />ADBG_CASE_DECLARE(XTEST_TEE_<xsl:value-of select="$position+9000" />);\
-</xsl:for-each>
-/* end of case declarations */
-
-<xsl:text>
-#endif /*ADBG_CASE_DECLARE_H*/</xsl:text>
-</xsl:template>
-</xsl:stylesheet>
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Adbg/xslstable/adbg_entry_declare.xsl b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Adbg/xslstable/adbg_entry_declare.xsl
deleted file mode 100644
index 6fd928f..0000000
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Adbg/xslstable/adbg_entry_declare.xsl
+++ b/dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- Copyright (c) 2014, STMicroelectronics International N.V. -->
-<!-- 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. -->
-
-<xsl:stylesheet version="1.0"
-xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-<xsl:output method="text"/>
-<xsl:strip-space elements="*"/>
-<xsl:param name="target"/>
-<xsl:param name="f2" select="'TEE_DataStorage_API.xml'"/>
-<xsl:param name="f3" select="'TEE_Internal_API.xml'"/>
-<xsl:param name="f4" select="'TEE_TimeArithm_API.xml'"/>
-<xsl:param name="f5" select="'TEE_Crypto_API.xml'"/>
-<xsl:variable name="doc2" select="document($f2)"/>
-<xsl:variable name="doc3" select="document($f3)"/>
-<xsl:variable name="doc4" select="document($f4)"/>
-<xsl:variable name="doc5" select="document($f5)"/>
-
-<xsl:template match="package">
-<xsl:text>/*
- * Copyright (c) 2014, STMicroelectronics International N.V.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License Version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#ifndef ADBG_ENTRY_DECLARE_H
-#define ADBG_ENTRY_DECLARE_H
-
-#define ADBG_ENTRY_AUTO_GENERATED_TESTS() \
-</xsl:text>
-<xsl:for-each select="initial-state/scenario">
-<xsl:variable name="position" select="position()" /> ADBG_SUITE_ENTRY(XTEST_TEE_<xsl:value-of select="$position+7000" />)\
-</xsl:for-each>
-<xsl:text>\
-</xsl:text>
-<xsl:for-each select="$doc2/package/initial-state/scenario">
-<xsl:variable name="position" select="position()" /> ADBG_SUITE_ENTRY(XTEST_TEE_<xsl:value-of select="$position+7500" />)\
-</xsl:for-each>
-<xsl:text>\
-</xsl:text>
-<xsl:for-each select="$doc3/package/initial-state/scenario">
-<xsl:variable name="position" select="position()" /> ADBG_SUITE_ENTRY(XTEST_TEE_<xsl:value-of select="$position+8000" />)\
-</xsl:for-each>
-<xsl:text>\
-</xsl:text>
-<xsl:for-each select="$doc4/package/initial-state/scenario">
-<xsl:variable name="position" select="position()" /> ADBG_SUITE_ENTRY(XTEST_TEE_<xsl:value-of select="$position+8500" />)\
-</xsl:for-each>
-<xsl:text>\
-</xsl:text>
-<xsl:for-each select="$doc5/package/initial-state/scenario">
-<xsl:variable name="position" select="position()" /> ADBG_SUITE_ENTRY(XTEST_TEE_<xsl:value-of select="$position+9000" />)\
-</xsl:for-each>
-<xsl:text>
-/* end of entry declarations */
-
-#endif /*ADBG_ENTRY_DECLARE_H*/
-</xsl:text>
-</xsl:template>
-</xsl:stylesheet>
-
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/ClientAPI/xslstable/TEE.xsl b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/ClientAPI/xslstable/TEE.xsl
index a5b14bf..56ab7fe 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/ClientAPI/xslstable/TEE.xsl
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/ClientAPI/xslstable/TEE.xsl
@@ -182,9 +182,7 @@ static void xtest_tee_<xsl:value-of select="position()+7000" />(ADBG_Case_t *c)
<xsl:for-each select="initial-state/scenario">
<xsl:variable name="position" select="position()+7000" />
-ADBG_CASE_DEFINE(XTEST_TEE_<xsl:value-of select="$position" />, xtest_tee_<xsl:value-of select="$position" /><xsl:text>,
- /* Title */
- "</xsl:text><xsl:value-of select="substring(substring-after(./@name, '('), 0, 9)" /><xsl:text>");</xsl:text>
+ADBG_CASE_DEFINE(gp, <xsl:value-of select="$position" />, xtest_tee_<xsl:value-of select="$position" /><xsl:text>, "</xsl:text><xsl:value-of select="substring(substring-after(./@name, '('), 0, 9)" /><xsl:text>");</xsl:text>
</xsl:for-each>
</xsl:template>
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Crypto/xslstable/TEE_Crypto_API.xsl b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Crypto/xslstable/TEE_Crypto_API.xsl
index 60f59c0..2bde7ca 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Crypto/xslstable/TEE_Crypto_API.xsl
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Crypto/xslstable/TEE_Crypto_API.xsl
@@ -284,9 +284,7 @@ static void xtest_tee_<xsl:value-of select="position()+9000" />(ADBG_Case_t *c)
<xsl:for-each select="initial-state/scenario">
<xsl:variable name="position" select="position()+9000" />
-ADBG_CASE_DEFINE(XTEST_TEE_<xsl:value-of select="$position" />, xtest_tee_<xsl:value-of select="$position" /><xsl:text>,
- /* Title */
- "</xsl:text><xsl:value-of select="substring(substring-after(./@name, '('), 0, 9)" /><xsl:text>");</xsl:text>
+ADBG_CASE_DEFINE(gp, <xsl:value-of select="$position" />, xtest_tee_<xsl:value-of select="$position" /><xsl:text>, "</xsl:text><xsl:value-of select="substring(substring-after(./@name, '('), 0, 9)" /><xsl:text>");</xsl:text>
</xsl:for-each>
</xsl:template>
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/DataStorage/xslstable/TEE_DataStorage_API.xsl b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/DataStorage/xslstable/TEE_DataStorage_API.xsl
index 0f17c0f..780e1bd 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/DataStorage/xslstable/TEE_DataStorage_API.xsl
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/DataStorage/xslstable/TEE_DataStorage_API.xsl
@@ -202,9 +202,7 @@ static void xtest_tee_<xsl:value-of select="position()+7500" />(ADBG_Case_t *c)
<xsl:for-each select="initial-state/scenario">
<xsl:variable name="position" select="position()+7500" />
-ADBG_CASE_DEFINE(XTEST_TEE_<xsl:value-of select="$position" />, xtest_tee_<xsl:value-of select="$position" /><xsl:text>,
- /* Title */
- "</xsl:text><xsl:value-of select="substring(substring-after(./@name, '('), 0, 9)" /><xsl:text>");</xsl:text>
+ADBG_CASE_DEFINE(gp, <xsl:value-of select="$position" />, xtest_tee_<xsl:value-of select="$position" /><xsl:text>, "</xsl:text><xsl:value-of select="substring(substring-after(./@name, '('), 0, 9)" /><xsl:text>");</xsl:text>
</xsl:for-each>
</xsl:template>
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Time_Arithmetical/xslstable/TEE_TimeArithm_API.xsl b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Time_Arithmetical/xslstable/TEE_TimeArithm_API.xsl
index c97de56..fb6ac11 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Time_Arithmetical/xslstable/TEE_TimeArithm_API.xsl
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/Time_Arithmetical/xslstable/TEE_TimeArithm_API.xsl
@@ -183,9 +183,7 @@ static void xtest_tee_<xsl:value-of select="position()+8500" />(ADBG_Case_t *c)
<xsl:for-each select="initial-state/scenario">
<xsl:variable name="position" select="position()+8500" />
-ADBG_CASE_DEFINE(XTEST_TEE_<xsl:value-of select="$position" />, xtest_tee_<xsl:value-of select="$position" /><xsl:text>,
- /* Title */
- "</xsl:text><xsl:value-of select="substring(substring-after(./@name, '('), 0, 9)" /><xsl:text>");</xsl:text>
+ADBG_CASE_DEFINE(gp, <xsl:value-of select="$position" />, xtest_tee_<xsl:value-of select="$position" /><xsl:text>, "</xsl:text><xsl:value-of select="substring(substring-after(./@name, '('), 0, 9)" /><xsl:text>");</xsl:text>
</xsl:for-each>
</xsl:template>
diff --git a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/TrustedCoreFw/xslstable/TEE_Internal_API.xsl b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/TrustedCoreFw/xslstable/TEE_Internal_API.xsl
index 97915a3..872a409 100644
--- a/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/TrustedCoreFw/xslstable/TEE_Internal_API.xsl
+++ b/demos/optee_test/package/testsuite/global_platform/api_1.0/GP_XSL_TEE_Initial_Configuration-Test_Suite_v1_0_0-2014-12-03-STM/packages/TrustedCoreFw/xslstable/TEE_Internal_API.xsl
@@ -177,9 +177,7 @@ static void xtest_tee_<xsl:value-of select="position()+8000" />(ADBG_Case_t *c)
</xsl:for-each>
<xsl:for-each select="initial-state/scenario">
<xsl:variable name="position" select="position()+8000" />
-ADBG_CASE_DEFINE(XTEST_TEE_<xsl:value-of select="$position" />, xtest_tee_<xsl:value-of select="$position" /><xsl:text>,
- /* Title */
- "</xsl:text><xsl:value-of select="substring(substring-after(./@name, '('), 0, 9)" /><xsl:text>");</xsl:text>
+ADBG_CASE_DEFINE(gp, <xsl:value-of select="$position" />, xtest_tee_<xsl:value-of select="$position" /><xsl:text>, "</xsl:text><xsl:value-of select="substring(substring-after(./@name, '('), 0, 9)" /><xsl:text>");</xsl:text>
</xsl:for-each>
</xsl:template>
diff --git a/demos/optee_test/scripts/common.mk b/demos/optee_test/scripts/common.mk
new file mode 100644
index 0000000..103a415
--- a/dev/null
+++ b/demos/optee_test/scripts/common.mk
@@ -0,0 +1,9 @@
+# Makefile script used in various OP-TEE test components
+
+# Since 'clean' make rules rely on 'rmdir', removed directories shall
+# not end with 'current directory' (./ or .) subpath information.
+# This macro remove trailing './' info from input path.
+define strip-trailing-slashes-and-dots
+$(eval _o := $(patsubst %/,%,$(patsubst %/.,%,$(1))))$(if \
+ $(filter-out $(1),$(_o)),$(call strip-trailing-slashes-and-dots,$(_o)),$(_o))
+endef
diff --git a/demos/optee_test/ta/Makefile b/demos/optee_test/ta/Makefile
index d5e80f3..25ede31 100644
--- a/demos/optee_test/ta/Makefile
+++ b/demos/optee_test/ta/Makefile
@@ -1,10 +1,15 @@
# Normally this makefile shouldn't be called directly and we expect the output
# path to be on a certain location to fit together with the other OP-TEE
# gits and helper scripts.
-ifeq ($O,)
-$(error output path should be specified when calling this makefile)
+
+include ../scripts/common.mk
+out-dir := $(call strip-trailing-slashes-and-dots,$(O))
+ifeq ($(out-dir),)
+$(error invalid output directory (O=$(O)))
endif
+include $(TA_DEV_KIT_DIR)/host_include/conf.mk
+
# Prevent use of LDFLAGS from the environment. For example, yocto exports
# LDFLAGS that are suitable for the client applications, not for TAs
LDFLAGS=
@@ -20,7 +25,12 @@ TA_DIRS := create_fail_test \
concurrent_large \
storage_benchmark \
sha_perf \
- aes_perf
+ aes_perf \
+ socket
+
+ifeq ($(CFG_SECURE_DATA_PATH),y)
+TA_DIRS += sdp_basic
+endif
ifdef CFG_GP_PACKAGE_PATH
TA_DIRS += GP_TTA_Arithmetical \
@@ -44,8 +54,16 @@ all: ta
.PHONY: ta
ta:
- $(q)$(foreach dir,$(TA_DIRS), $(MAKE) -C $(dir) O=$(O)/$(dir) &&) true
+ $(q)$(foreach dir,$(TA_DIRS), $(MAKE) -C $(dir) O=$(out-dir)/ta/$(dir) &&) true
+
+# remove build directories including ta/<ta-name>/ directories.
+# Note: $(out-dir) may be a relative path.
+RMDIR := rmdir --ignore-fail-on-non-empty
+define rm-build-subdir
+echo `[ -d $1 ] && { cd $1; $(RMDIR) $(out-dir)/ta $(out-dir) 2> /dev/null; true; }` > /dev/null
+endef
.PHONY: clean
clean:
- $(q)$(foreach dir,$(TA_DIRS), $(MAKE) -C $(dir) O=$(O)/$(dir) $@ &&) true
+ $(q)$(foreach dir,$(TA_DIRS), [ ! -d $(dir) ] || $(MAKE) -C $(dir) O=$(out-dir)/ta/$(dir) $@ &&) true
+ $(q)$(foreach dir,$(TA_DIRS), $(call rm-build-subdir,$(dir));)
diff --git a/demos/optee_test/ta/aes_perf/Android.mk b/demos/optee_test/ta/aes_perf/Android.mk
index c59c884..8fc8de6 100644
--- a/demos/optee_test/ta/aes_perf/Android.mk
+++ b/demos/optee_test/ta/aes_perf/Android.mk
@@ -1,42 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
-TDK_PATH:=../../../../ta_export
-TA_BINARY=e626662e-c0e2-485c-b8c8-09fbce6edf3d
-TA_CROSS_COMPILE=arm-linux-gnueabihf-
-TA_EXPORT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/system/lib/teetz
-OUTPUT_DIR := ../../out/ta/$(notdir $(LOCAL_PATH))
+LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-$(info $(shell make CROSS_COMPILE=$(TA_CROSS_COMPILE) -C $(LOCAL_PATH) O=$(OUTPUT_DIR) TA_DEV_KIT_DIR=$(TDK_PATH)))
-
-$(info $(shell if [ ! -e $(TA_EXPORT_DIR) ]; then mkdir -p $(TA_EXPORT_DIR); fi))
-
-ta_file := $(wildcard $(OUTPUT_DIR)/*.ta)
-ta_file := $(patsubst $(OUTPUT_DIR)/%,%,$(ta_file))
-
-ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY), true)
-$(info $(shell $(TA_SIGN_TOOL) --rootkey=$(TA_ROOT_KEY) --takey=$(TA_USER_KEY) \
- --in=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta \
- --out=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta ))
-endif
-
-$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib))
-$(info $(shell cp -vf $(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta $(PRODUCT_OUT)/obj/lib))
-
-LOCAL_MODULE := $(TA_BINARY)
-LOCAL_SRC_FILES := $(ta_file)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .ta
-LOCAL_MODULE_PATH := $(TA_EXPORT_DIR)
-LOCAL_STRIP_MODULE := false
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tee_aes_perf_ta
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-LOCAL_REQUIRED_MODULES := $(TA_BINARY)
-
-include $(BUILD_PHONY_PACKAGE)
+local_module := e626662e-c0e2-485c-b8c8-09fbce6edf3d.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/concurrent/Android.mk b/demos/optee_test/ta/concurrent/Android.mk
index ccae656..06cc783 100644
--- a/demos/optee_test/ta/concurrent/Android.mk
+++ b/demos/optee_test/ta/concurrent/Android.mk
@@ -1,42 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
-TDK_PATH:=../../../../ta_export
-TA_BINARY=e13010e0-2ae1-11e5-896a-0002a5d5c51b
-TA_CROSS_COMPILE=arm-linux-gnueabihf-
-TA_EXPORT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/system/lib/teetz
-OUTPUT_DIR := ../../out/ta/$(notdir $(LOCAL_PATH))
+LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-$(info $(shell make CROSS_COMPILE=$(TA_CROSS_COMPILE) -C $(LOCAL_PATH) O=$(OUTPUT_DIR) TA_DEV_KIT_DIR=$(TDK_PATH)))
-
-$(info $(shell if [ ! -e $(TA_EXPORT_DIR) ]; then mkdir -p $(TA_EXPORT_DIR); fi))
-
-ta_file := $(wildcard $(OUTPUT_DIR)/*.ta)
-ta_file := $(patsubst $(OUTPUT_DIR)/%,%,$(ta_file))
-
-ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY), true)
-$(info $(shell $(TA_SIGN_TOOL) --rootkey=$(TA_ROOT_KEY) --takey=$(TA_USER_KEY) \
- --in=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta \
- --out=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta ))
-endif
-
-$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib))
-$(info $(shell cp -vf $(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta $(PRODUCT_OUT)/obj/lib))
-
-LOCAL_MODULE := $(TA_BINARY)
-LOCAL_SRC_FILES := $(ta_file)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .ta
-LOCAL_MODULE_PATH := $(TA_EXPORT_DIR)
-LOCAL_STRIP_MODULE := false
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tee_concurrent_ta
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-LOCAL_REQUIRED_MODULES := $(TA_BINARY)
-
-include $(BUILD_PHONY_PACKAGE)
+local_module := e13010e0-2ae1-11e5-896a-0002a5d5c51b.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/concurrent_large/Android.mk b/demos/optee_test/ta/concurrent_large/Android.mk
index 69b9e92..029306a 100644
--- a/demos/optee_test/ta/concurrent_large/Android.mk
+++ b/demos/optee_test/ta/concurrent_large/Android.mk
@@ -1,42 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
-TDK_PATH:=../../../../ta_export
-TA_BINARY=5ce0c432-0ab0-40e5-a056-782ca0e6aba2
-TA_CROSS_COMPILE=arm-linux-gnueabihf-
-TA_EXPORT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/system/lib/teetz
-OUTPUT_DIR := ../../out/ta/$(notdir $(LOCAL_PATH))
+LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-$(info $(shell make CROSS_COMPILE=$(TA_CROSS_COMPILE) -C $(LOCAL_PATH) O=$(OUTPUT_DIR) TA_DEV_KIT_DIR=$(TDK_PATH)))
-
-$(info $(shell if [ ! -e $(TA_EXPORT_DIR) ]; then mkdir -p $(TA_EXPORT_DIR); fi))
-
-ta_file := $(wildcard $(OUTPUT_DIR)/*.ta)
-ta_file := $(patsubst $(OUTPUT_DIR)/%,%,$(ta_file))
-
-ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY), true)
-$(info $(shell $(TA_SIGN_TOOL) --rootkey=$(TA_ROOT_KEY) --takey=$(TA_USER_KEY) \
- --in=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta \
- --out=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta ))
-endif
-
-$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib))
-$(info $(shell cp -vf $(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta $(PRODUCT_OUT)/obj/lib))
-
-LOCAL_MODULE := $(TA_BINARY)
-LOCAL_SRC_FILES := $(ta_file)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .ta
-LOCAL_MODULE_PATH := $(TA_EXPORT_DIR)
-LOCAL_STRIP_MODULE := false
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tee_concurrent_large_ta
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-LOCAL_REQUIRED_MODULES := $(TA_BINARY)
-
-include $(BUILD_PHONY_PACKAGE)
+local_module := 5ce0c432-0ab0-40e5-a056-782ca0e6aba2.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/create_fail_test/Android.mk b/demos/optee_test/ta/create_fail_test/Android.mk
index d5a11f2..c0c6bba 100644
--- a/demos/optee_test/ta/create_fail_test/Android.mk
+++ b/demos/optee_test/ta/create_fail_test/Android.mk
@@ -1,42 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
-TDK_PATH:=../../../../ta_export
-TA_BINARY=c3f6e2c0-3548-11e1-b86c-0800200c9a66
-TA_CROSS_COMPILE=arm-linux-gnueabihf-
-TA_EXPORT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/system/lib/teetz
-OUTPUT_DIR := ../../out/ta/$(notdir $(LOCAL_PATH))
+LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-$(info $(shell make CROSS_COMPILE=$(TA_CROSS_COMPILE) -C $(LOCAL_PATH) O=$(OUTPUT_DIR) TA_DEV_KIT_DIR=$(TDK_PATH)))
-
-$(info $(shell if [ ! -e $(TA_EXPORT_DIR) ]; then mkdir -p $(TA_EXPORT_DIR); fi))
-
-ta_file := $(wildcard $(OUTPUT_DIR)/*.ta)
-ta_file := $(patsubst $(OUTPUT_DIR)/%,%,$(ta_file))
-
-ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY), true)
-$(info $(shell $(TA_SIGN_TOOL) --rootkey=$(TA_ROOT_KEY) --takey=$(TA_USER_KEY) \
- --in=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta \
- --out=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta ))
-endif
-
-$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib))
-$(info $(shell cp -vf $(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta $(PRODUCT_OUT)/obj/lib))
-
-LOCAL_MODULE := $(TA_BINARY)
-LOCAL_SRC_FILES := $(ta_file)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .ta
-LOCAL_MODULE_PATH := $(TA_EXPORT_DIR)
-LOCAL_STRIP_MODULE := false
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tee_fail_test_ta
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-LOCAL_REQUIRED_MODULES := $(TA_BINARY)
-
-include $(BUILD_PHONY_PACKAGE)
+local_module := c3f6e2c0-3548-11e1-b86c-0800200c9a66.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/crypt/Android.mk b/demos/optee_test/ta/crypt/Android.mk
index 69a62cc..bc9e445 100644
--- a/demos/optee_test/ta/crypt/Android.mk
+++ b/demos/optee_test/ta/crypt/Android.mk
@@ -1,42 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
-TDK_PATH:=../../../../ta_export
-TA_BINARY=cb3e5ba0-adf1-11e0-998b-0002a5d5c51b
-TA_CROSS_COMPILE=arm-linux-gnueabihf-
-TA_EXPORT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/system/lib/teetz
-OUTPUT_DIR := ../../out/ta/$(notdir $(LOCAL_PATH))
+LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-$(info $(shell make CROSS_COMPILE=$(TA_CROSS_COMPILE) -C $(LOCAL_PATH) O=$(OUTPUT_DIR) TA_DEV_KIT_DIR=$(TDK_PATH)))
-
-$(info $(shell if [ ! -e $(TA_EXPORT_DIR) ]; then mkdir -p $(TA_EXPORT_DIR); fi))
-
-ta_file := $(wildcard $(OUTPUT_DIR)/*.ta)
-ta_file := $(patsubst $(OUTPUT_DIR)/%,%,$(ta_file))
-
-ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY), true)
-$(info $(shell $(TA_SIGN_TOOL) --rootkey=$(TA_ROOT_KEY) --takey=$(TA_USER_KEY) \
- --in=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta \
- --out=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta ))
-endif
-
-$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib))
-$(info $(shell cp -vf $(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta $(PRODUCT_OUT)/obj/lib))
-
-LOCAL_MODULE := $(TA_BINARY)
-LOCAL_SRC_FILES := $(ta_file)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .ta
-LOCAL_MODULE_PATH := $(TA_EXPORT_DIR)
-LOCAL_STRIP_MODULE := false
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tee_crypt_ta
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-LOCAL_REQUIRED_MODULES := $(TA_BINARY)
-
-include $(BUILD_PHONY_PACKAGE)
+local_module := cb3e5ba0-adf1-11e0-998b-0002a5d5c51b.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/include/GP_defs.h b/demos/optee_test/ta/include/GP_defs.h
new file mode 100644
index 0000000..3d6ef1d
--- a/dev/null
+++ b/demos/optee_test/ta/include/GP_defs.h
@@ -0,0 +1,4 @@
+#define SLogTrace(...)
+#define SLogError(...)
+#define SLogWarning(...)
+#define S_VAR_NOT_USED(x) do { (void)(x); } while (0)
diff --git a/demos/optee_test/ta/os_test/Android.mk b/demos/optee_test/ta/os_test/Android.mk
index e3e83b8..8136a3b 100644
--- a/demos/optee_test/ta/os_test/Android.mk
+++ b/demos/optee_test/ta/os_test/Android.mk
@@ -1,42 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
-TDK_PATH:=../../../../ta_export
-TA_BINARY=5b9e0e40-2636-11e1-ad9e-0002a5d5c51b
-TA_CROSS_COMPILE=arm-linux-gnueabihf-
-TA_EXPORT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/system/lib/teetz
-OUTPUT_DIR := ../../out/ta/$(notdir $(LOCAL_PATH))
+LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-$(info $(shell make CROSS_COMPILE=$(TA_CROSS_COMPILE) -C $(LOCAL_PATH) O=$(OUTPUT_DIR) TA_DEV_KIT_DIR=$(TDK_PATH)))
-
-$(info $(shell if [ ! -e $(TA_EXPORT_DIR) ]; then mkdir -p $(TA_EXPORT_DIR); fi))
-
-ta_file := $(wildcard $(OUTPUT_DIR)/*.ta)
-ta_file := $(patsubst $(OUTPUT_DIR)/%,%,$(ta_file))
-
-ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY), true)
-$(info $(shell $(TA_SIGN_TOOL) --rootkey=$(TA_ROOT_KEY) --takey=$(TA_USER_KEY) \
- --in=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta \
- --out=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta ))
-endif
-
-$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib))
-$(info $(shell cp -vf $(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta $(PRODUCT_OUT)/obj/lib))
-
-LOCAL_MODULE := $(TA_BINARY)
-LOCAL_SRC_FILES := $(ta_file)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .ta
-LOCAL_MODULE_PATH := $(TA_EXPORT_DIR)
-LOCAL_STRIP_MODULE := false
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tee_os_test_ta
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-LOCAL_REQUIRED_MODULES := $(TA_BINARY)
-
-include $(BUILD_PHONY_PACKAGE)
+local_module := 5b9e0e40-2636-11e1-ad9e-0002a5d5c51b.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/os_test/include/user_ta_header_defines.h b/demos/optee_test/ta/os_test/include/user_ta_header_defines.h
index 661b6d7..83e37e5 100644
--- a/demos/optee_test/ta/os_test/include/user_ta_header_defines.h
+++ b/demos/optee_test/ta/os_test/include/user_ta_header_defines.h
@@ -35,8 +35,8 @@
#define TA_UUID TA_OS_TEST_UUID
#define TA_FLAGS (TA_FLAG_USER_MODE | TA_FLAG_EXEC_DDR | \
- TA_FLAG_UNSAFE_NW_PARAMS | \
TA_FLAG_MULTI_SESSION)
+
#define TA_STACK_SIZE (8 * 1024)
#define TA_DATA_SIZE (900 * 1024)
diff --git a/demos/optee_test/ta/os_test/tb_modulus.c b/demos/optee_test/ta/os_test/tb_modulus.c
index f664214..aed4a70 100644
--- a/demos/optee_test/ta/os_test/tb_modulus.c
+++ b/demos/optee_test/ta/os_test/tb_modulus.c
@@ -466,7 +466,7 @@ static void test_modular_inv(void)
void tb_modulus(void)
{
- const char *TEST_NAME = "Modulare arithmetics";
+ const char *TEST_NAME = "Modular arithmetic";
TB_HEADER(TEST_NAME);
test_modular_reduction();
diff --git a/demos/optee_test/ta/rpc_test/Android.mk b/demos/optee_test/ta/rpc_test/Android.mk
index 0e6333c..1b570f3 100644
--- a/demos/optee_test/ta/rpc_test/Android.mk
+++ b/demos/optee_test/ta/rpc_test/Android.mk
@@ -1,42 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
-TDK_PATH:=../../../../ta_export
-TA_BINARY=d17f73a0-36ef-11e1-984a-0002a5d5c51b
-TA_CROSS_COMPILE=arm-linux-gnueabihf-
-TA_EXPORT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/system/lib/teetz
-OUTPUT_DIR := ../../out/ta/$(notdir $(LOCAL_PATH))
+LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-$(info $(shell make CROSS_COMPILE=$(TA_CROSS_COMPILE) -C $(LOCAL_PATH) O=$(OUTPUT_DIR) TA_DEV_KIT_DIR=$(TDK_PATH)))
-
-$(info $(shell if [ ! -e $(TA_EXPORT_DIR) ]; then mkdir -p $(TA_EXPORT_DIR); fi))
-
-ta_file := $(wildcard $(OUTPUT_DIR)/*.ta)
-ta_file := $(patsubst $(OUTPUT_DIR)/%,%,$(ta_file))
-
-ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY), true)
-$(info $(shell $(TA_SIGN_TOOL) --rootkey=$(TA_ROOT_KEY) --takey=$(TA_USER_KEY) \
- --in=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta \
- --out=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta ))
-endif
-
-$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib))
-$(info $(shell cp -vf $(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta $(PRODUCT_OUT)/obj/lib))
-
-LOCAL_MODULE := $(TA_BINARY)
-LOCAL_SRC_FILES := $(ta_file)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .ta
-LOCAL_MODULE_PATH := $(TA_EXPORT_DIR)
-LOCAL_STRIP_MODULE := false
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tee_rpc_test_ta
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-LOCAL_REQUIRED_MODULES := $(TA_BINARY)
-
-include $(BUILD_PHONY_PACKAGE)
+local_module := d17f73a0-36ef-11e1-984a-0002a5d5c51b.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/rpc_test/include/ta_rpc.h b/demos/optee_test/ta/rpc_test/include/ta_rpc.h
index 58b74ff..9888055 100644
--- a/demos/optee_test/ta/rpc_test/include/ta_rpc.h
+++ b/demos/optee_test/ta/rpc_test/include/ta_rpc.h
@@ -31,10 +31,12 @@
#include <ta_rpc_test.h>
#include <tee_api.h>
-TEE_Result rpc_sha224(uint32_t nParamTypes, TEE_Param pParams[4]);
-TEE_Result rpc_sha256(uint32_t nParamTypes, TEE_Param pParams[4]);
-TEE_Result rpc_aes256ecb_encrypt(uint32_t nParamTypes, TEE_Param pParams[4]);
-TEE_Result rpc_aes256ecb_decrypt(uint32_t nParamTypes, TEE_Param pParams[4]);
+TEE_Result rpc_sha224(bool sec_mem, uint32_t nParamTypes, TEE_Param pParams[4]);
+TEE_Result rpc_sha256(bool sec_mem, uint32_t nParamTypes, TEE_Param pParams[4]);
+TEE_Result rpc_aes256ecb_encrypt(bool sec_mem, uint32_t nParamTypes,
+ TEE_Param pParams[4]);
+TEE_Result rpc_aes256ecb_decrypt(bool sec_mem, uint32_t nParamTypes,
+ TEE_Param pParams[4]);
TEE_Result rpc_open(void *session_context, uint32_t param_types,
TEE_Param params[4]);
diff --git a/demos/optee_test/ta/rpc_test/include/ta_rpc_test.h b/demos/optee_test/ta/rpc_test/include/ta_rpc_test.h
index 44541fb..a9335e8 100644
--- a/demos/optee_test/ta/rpc_test/include/ta_rpc_test.h
+++ b/demos/optee_test/ta/rpc_test/include/ta_rpc_test.h
@@ -33,10 +33,14 @@
#define TA_RPC_TEST_UUID { 0xd17f73a0, 0x36ef, 0x11e1, \
{ 0x98, 0x4a, 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }
-#define TA_RPC_CMD_CRYPT_SHA224 1
-#define TA_RPC_CMD_CRYPT_SHA256 2
-#define TA_RPC_CMD_CRYPT_AES256ECB_ENC 3
-#define TA_RPC_CMD_CRYPT_AES256ECB_DEC 4
-#define TA_RPC_CMD_OPEN 5
+#define TA_RPC_CMD_CRYPT_SHA224 1
+#define TA_RPC_CMD_CRYPT_SHA256 2
+#define TA_RPC_CMD_CRYPT_AES256ECB_ENC 3
+#define TA_RPC_CMD_CRYPT_AES256ECB_DEC 4
+#define TA_RPC_CMD_OPEN 5
+#define TA_RPC_CMD_CRYPT_PRIVMEM_SHA224 6
+#define TA_RPC_CMD_CRYPT_PRIVMEM_SHA256 7
+#define TA_RPC_CMD_CRYPT_PRIVMEM_AES256ECB_ENC 8
+#define TA_RPC_CMD_CRYPT_PRIVMEM_AES256ECB_DEC 9
#endif
diff --git a/demos/optee_test/ta/rpc_test/ta_entry.c b/demos/optee_test/ta/rpc_test/ta_entry.c
index 82d5f55..9964977 100644
--- a/demos/optee_test/ta/rpc_test/ta_entry.c
+++ b/demos/optee_test/ta/rpc_test/ta_entry.c
@@ -69,20 +69,32 @@ TEE_Result TA_InvokeCommandEntryPoint(void *pSessionContext,
switch (nCommandID) {
case TA_RPC_CMD_CRYPT_SHA224:
- return rpc_sha224(nParamTypes, pParams);
+ return rpc_sha224(false, nParamTypes, pParams);
case TA_RPC_CMD_CRYPT_SHA256:
- return rpc_sha256(nParamTypes, pParams);
+ return rpc_sha256(false, nParamTypes, pParams);
case TA_RPC_CMD_CRYPT_AES256ECB_ENC:
- return rpc_aes256ecb_encrypt(nParamTypes, pParams);
+ return rpc_aes256ecb_encrypt(false, nParamTypes, pParams);
case TA_RPC_CMD_CRYPT_AES256ECB_DEC:
- return rpc_aes256ecb_decrypt(nParamTypes, pParams);
+ return rpc_aes256ecb_decrypt(false, nParamTypes, pParams);
case TA_RPC_CMD_OPEN:
return rpc_open(pSessionContext, nParamTypes, pParams);
+ case TA_RPC_CMD_CRYPT_PRIVMEM_SHA224:
+ return rpc_sha224(true, nParamTypes, pParams);
+
+ case TA_RPC_CMD_CRYPT_PRIVMEM_SHA256:
+ return rpc_sha256(true, nParamTypes, pParams);
+
+ case TA_RPC_CMD_CRYPT_PRIVMEM_AES256ECB_ENC:
+ return rpc_aes256ecb_encrypt(true, nParamTypes, pParams);
+
+ case TA_RPC_CMD_CRYPT_PRIVMEM_AES256ECB_DEC:
+ return rpc_aes256ecb_decrypt(true, nParamTypes, pParams);
+
default:
return TEE_ERROR_BAD_PARAMETERS;
}
diff --git a/demos/optee_test/ta/rpc_test/ta_rpc.c b/demos/optee_test/ta/rpc_test/ta_rpc.c
index 2bab4e9..5def597 100644
--- a/demos/optee_test/ta/rpc_test/ta_rpc.c
+++ b/demos/optee_test/ta/rpc_test/ta_rpc.c
@@ -34,13 +34,14 @@
static TEE_UUID cryp_uuid = TA_CRYPT_UUID;
-static TEE_Result rpc_call_cryp(uint32_t nParamTypes, TEE_Param pParams[4],
- uint32_t cmd)
+static TEE_Result rpc_call_cryp(bool sec_mem, uint32_t nParamTypes,
+ TEE_Param pParams[4], uint32_t cmd)
{
TEE_TASessionHandle cryp_session;
TEE_Result res;
uint32_t origin;
TEE_Param params[4];
+ size_t n;
uint32_t types =
TEE_PARAM_TYPES(TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE,
@@ -57,37 +58,99 @@ static TEE_Result rpc_call_cryp(uint32_t nParamTypes, TEE_Param pParams[4],
return res;
}
- res = TEE_InvokeTACommand(cryp_session, 0, cmd, nParamTypes,
- pParams, &origin);
+ types = nParamTypes;
+ if (sec_mem) {
+ TEE_MemFill(params, 0, sizeof(params));
+ for (n = 0; n < 4; n++) {
+ switch (TEE_PARAM_TYPE_GET(types, n)) {
+ case TEE_PARAM_TYPE_VALUE_INPUT:
+ case TEE_PARAM_TYPE_VALUE_INOUT:
+ params[n].value = pParams[n].value;
+ break;
+
+ case TEE_PARAM_TYPE_MEMREF_INPUT:
+ case TEE_PARAM_TYPE_MEMREF_OUTPUT:
+ case TEE_PARAM_TYPE_MEMREF_INOUT:
+ params[n].memref.buffer =
+ TEE_Malloc(pParams[n].memref.size, 0);
+ if (!params[n].memref.buffer)
+ TEE_Panic(0);
+ params[n].memref.size = pParams[n].memref.size;
+ if (TEE_PARAM_TYPE_GET(types, n) !=
+ TEE_PARAM_TYPE_MEMREF_OUTPUT)
+ TEE_MemMove(params[n].memref.buffer,
+ pParams[n].memref.buffer,
+ pParams[n].memref.size);
+ break;
+ default:
+ break;
+ }
+ }
+ } else {
+ TEE_MemMove(params, pParams, sizeof(params));
+ }
+ res = TEE_InvokeTACommand(cryp_session, 0, cmd, types, params, &origin);
if (res != TEE_SUCCESS) {
- EMSG("rpc_sha256 - TEE_InvokeTACommand returned 0x%x\n",
+ EMSG("rpc_call_cryp - TEE_InvokeTACommand returned 0x%x\n",
(unsigned int)res);
}
TEE_CloseTASession(cryp_session);
+ if (sec_mem) {
+ for (n = 0; n < 4; n++) {
+ switch (TEE_PARAM_TYPE_GET(types, n)) {
+ case TEE_PARAM_TYPE_VALUE_INOUT:
+ case TEE_PARAM_TYPE_VALUE_OUTPUT:
+ pParams[n].value = params[n].value;
+ break;
+
+ case TEE_PARAM_TYPE_MEMREF_INPUT:
+ case TEE_PARAM_TYPE_MEMREF_OUTPUT:
+ case TEE_PARAM_TYPE_MEMREF_INOUT:
+ if (TEE_PARAM_TYPE_GET(types, n) !=
+ TEE_PARAM_TYPE_MEMREF_INPUT)
+ TEE_MemMove(pParams[n].memref.buffer,
+ params[n].memref.buffer,
+ params[n].memref.size);
+ pParams[n].memref.size = params[n].memref.size;
+ TEE_Free(params[n].memref.buffer);
+ break;
+ default:
+ break;
+ }
+ }
+
+ }
+
return res;
}
-TEE_Result rpc_sha224(uint32_t nParamTypes, TEE_Param pParams[4])
+TEE_Result rpc_sha224(bool sec_mem, uint32_t nParamTypes, TEE_Param pParams[4])
{
- return rpc_call_cryp(nParamTypes, pParams, TA_CRYPT_CMD_SHA224);
+ return rpc_call_cryp(sec_mem, nParamTypes, pParams,
+ TA_CRYPT_CMD_SHA224);
}
-TEE_Result rpc_sha256(uint32_t nParamTypes, TEE_Param pParams[4])
+TEE_Result rpc_sha256(bool sec_mem, uint32_t nParamTypes, TEE_Param pParams[4])
{
- return rpc_call_cryp(nParamTypes, pParams, TA_CRYPT_CMD_SHA256);
+ return rpc_call_cryp(sec_mem, nParamTypes, pParams,
+ TA_CRYPT_CMD_SHA256);
}
-TEE_Result rpc_aes256ecb_encrypt(uint32_t nParamTypes, TEE_Param pParams[4])
+TEE_Result rpc_aes256ecb_encrypt(bool sec_mem, uint32_t nParamTypes,
+ TEE_Param pParams[4])
{
- return rpc_call_cryp(nParamTypes, pParams, TA_CRYPT_CMD_AES256ECB_ENC);
+ return rpc_call_cryp(sec_mem, nParamTypes, pParams,
+ TA_CRYPT_CMD_AES256ECB_ENC);
}
-TEE_Result rpc_aes256ecb_decrypt(uint32_t nParamTypes, TEE_Param pParams[4])
+TEE_Result rpc_aes256ecb_decrypt(bool sec_mem, uint32_t nParamTypes,
+ TEE_Param pParams[4])
{
- return rpc_call_cryp(nParamTypes, pParams, TA_CRYPT_CMD_AES256ECB_DEC);
+ return rpc_call_cryp(sec_mem, nParamTypes, pParams,
+ TA_CRYPT_CMD_AES256ECB_DEC);
}
TEE_Result rpc_open(void *session_context, uint32_t param_types,
diff --git a/demos/optee_test/ta/sdp_basic/Android.mk b/demos/optee_test/ta/sdp_basic/Android.mk
new file mode 100644
index 0000000..e31e2a6
--- a/dev/null
+++ b/demos/optee_test/ta/sdp_basic/Android.mk
@@ -0,0 +1,4 @@
+LOCAL_PATH := $(call my-dir)
+
+local_module := 12345678-5b69-11e4-9dbb-101f74f00099.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/sdp_basic/Makefile b/demos/optee_test/ta/sdp_basic/Makefile
new file mode 100644
index 0000000..0b848d1
--- a/dev/null
+++ b/demos/optee_test/ta/sdp_basic/Makefile
@@ -0,0 +1,8 @@
+BINARY = 12345678-5b69-11e4-9dbb-101f74f00099
+
+ifeq ($(CFG_CACHE_API),y)
+CFLAGS += -DCFG_CACHE_API=y
+endif
+
+include ../ta_common.mk
+
diff --git a/demos/optee_test/ta/sdp_basic/include/ta_sdp_basic.h b/demos/optee_test/ta/sdp_basic/include/ta_sdp_basic.h
new file mode 100644
index 0000000..029d681
--- a/dev/null
+++ b/demos/optee_test/ta/sdp_basic/include/ta_sdp_basic.h
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+
+#ifndef TA_SDP_BASIC_H
+#define TA_SDP_BASIC_H
+
+#define TA_SDP_BASIC_UUID { 0x12345678, 0x5b69, 0x11e4, \
+ { 0x9d, 0xbb, 0x10, 0x1f, 0x74, 0xf0, 0x00, 0x99 } }
+
+#define TA_SDP_BASIC_CMD_INJECT 0
+#define TA_SDP_BASIC_CMD_TRANSFORM 1
+#define TA_SDP_BASIC_CMD_DUMP 2
+
+#define TA_SDP_BASIC_CMD_INVOKE_INJECT 3
+#define TA_SDP_BASIC_CMD_INVOKE_TRANSFORM 4
+#define TA_SDP_BASIC_CMD_INVOKE_DUMP 5
+
+#define TA_SDP_BASIC_CMD_PTA_INJECT 6
+#define TA_SDP_BASIC_CMD_PTA_TRANSFORM 7
+#define TA_SDP_BASIC_CMD_PTA_DUMP 8
+
+#endif /* TA_SDP_BASIC_H */
diff --git a/demos/optee_test/ta/sdp_basic/include/user_ta_header_defines.h b/demos/optee_test/ta/sdp_basic/include/user_ta_header_defines.h
new file mode 100644
index 0000000..3c9b2bf
--- a/dev/null
+++ b/demos/optee_test/ta/sdp_basic/include/user_ta_header_defines.h
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+#ifndef USER_TA_HEADER_DEFINES_H
+#define USER_TA_HEADER_DEFINES_H
+
+#include "ta_sdp_basic.h"
+
+#define TA_UUID TA_SDP_BASIC_UUID
+
+#define TA_FLAGS (TA_FLAG_USER_MODE | TA_FLAG_EXEC_DDR | \
+ TA_FLAG_SECURE_DATA_PATH | \
+ TA_FLAG_CACHE_MAINTENANCE)
+
+#define TA_STACK_SIZE (2 * 1024)
+#define TA_DATA_SIZE (32 * 1024)
+
+#endif /* USER_TA_HEADER_DEFINES_H */
diff --git a/demos/optee_test/ta/sdp_basic/sub.mk b/demos/optee_test/ta/sdp_basic/sub.mk
new file mode 100644
index 0000000..7982705
--- a/dev/null
+++ b/demos/optee_test/ta/sdp_basic/sub.mk
@@ -0,0 +1,2 @@
+global-incdirs-y += include
+srcs-y += ta_sdp_basic.c
diff --git a/demos/optee_test/ta/sdp_basic/ta_sdp_basic.c b/demos/optee_test/ta/sdp_basic/ta_sdp_basic.c
new file mode 100644
index 0000000..7f3ab41
--- a/dev/null
+++ b/demos/optee_test/ta/sdp_basic/ta_sdp_basic.c
@@ -0,0 +1,386 @@
+/*
+ * 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 <pta_invoke_tests.h>
+#include <string.h>
+#include <ta_sdp_basic.h>
+#include <tee_api.h>
+#include <tee_internal_api_extensions.h>
+#include <tee_internal_api.h>
+#include <tee_ta_api.h>
+#include <trace.h>
+
+
+/*
+ * Basic Secure Data Path access test commands:
+ * - command INJECT: copy from non secure input into secure output.
+ * - command TRANSFROM: read, transform and write from/to secure in/out.
+ * - command DUMP: copy from secure input into non secure output.
+ */
+
+static TEE_Result cmd_inject(uint32_t types,
+ TEE_Param params[TEE_NUM_PARAMS])
+{
+ TEE_Result rc;
+ const int sec_idx = 1; /* highlight secure buffer index */
+ const int ns_idx = 0; /* highlight nonsecure buffer index */
+
+ if (types != TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_MEMREF_OUTPUT,
+ TEE_PARAM_TYPE_NONE,
+ TEE_PARAM_TYPE_NONE)) {
+ EMSG("bad parameters %x", (unsigned)types);
+ return TEE_ERROR_BAD_PARAMETERS;
+ }
+
+ if (params[sec_idx].memref.size < params[ns_idx].memref.size)
+ return TEE_ERROR_SHORT_BUFFER;
+
+ /*
+ * We could rely on the TEE to provide consistent buffer/size values
+ * to reference a buffer with a unique and consistent secure attribute
+ * value. Hence it is safe enough (and more optimal) to test only the
+ * secure attribute of a single byte of it. Yet, since the current
+ * test does not deal with performance, let check the secure attribute
+ * of each byte of the buffer.
+ */
+ rc = TEE_CheckMemoryAccessRights(TEE_MEMORY_ACCESS_ANY_OWNER |
+ TEE_MEMORY_ACCESS_READ |
+ TEE_MEMORY_ACCESS_NONSECURE,
+ params[ns_idx].memref.buffer,
+ params[ns_idx].memref.size);
+ if (rc != TEE_SUCCESS) {
+ EMSG("TEE_CheckMemoryAccessRights(nsec) failed %x", rc);
+ return rc;
+ }
+
+ rc = TEE_CheckMemoryAccessRights(TEE_MEMORY_ACCESS_ANY_OWNER |
+ TEE_MEMORY_ACCESS_WRITE |
+ TEE_MEMORY_ACCESS_SECURE,
+ params[sec_idx].memref.buffer,
+ params[sec_idx].memref.size);
+ if (rc != TEE_SUCCESS) {
+ EMSG("TEE_CheckMemoryAccessRights(secure) failed %x", rc);
+ return rc;
+ }
+
+
+#ifdef CFG_CACHE_API
+ /*
+ * we should invalidate cache (here we assume buffer were not
+ * filled through cpu core caches. We flush buffers so that
+ * cache is not corrupted in cache target buffer not aligned
+ * on cache line size.
+ */
+ rc = TEE_CacheFlush(params[sec_idx].memref.buffer,
+ params[sec_idx].memref.size);
+ if (rc != TEE_SUCCESS) {
+ EMSG("TEE_CacheFlush(%p, %x) failed: 0x%x",
+ params[sec_idx].memref.buffer,
+ params[sec_idx].memref.size, rc);
+ return rc;
+ }
+#endif /* CFG_CACHE_API */
+
+ /* inject data */
+ TEE_MemMove(params[sec_idx].memref.buffer,
+ params[ns_idx].memref.buffer,
+ params[sec_idx].memref.size);
+
+#ifdef CFG_CACHE_API
+ rc = TEE_CacheFlush(params[sec_idx].memref.buffer,
+ params[sec_idx].memref.size);
+ if (rc != TEE_SUCCESS) {
+ EMSG("TEE_CacheFlush(%p, %x) failed: 0x%x",
+ params[sec_idx].memref.buffer,
+ params[sec_idx].memref.size, rc);
+ return rc;
+ }
+#endif /* CFG_CACHE_API */
+
+ return rc;
+}
+
+static TEE_Result cmd_transform(uint32_t types,
+ TEE_Param params[TEE_NUM_PARAMS])
+{
+ TEE_Result rc;
+ unsigned char *p;
+ size_t sz;
+
+ if (types != TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INOUT,
+ TEE_PARAM_TYPE_NONE,
+ TEE_PARAM_TYPE_NONE,
+ TEE_PARAM_TYPE_NONE))
+ return TEE_ERROR_BAD_PARAMETERS;
+
+ /*
+ * We could rely on the TEE to provide consistent buffer/size values
+ * to reference a buffer with a unique and consistent secure attribute
+ * value. Hence it is safe enough (and more optimal) to test only the
+ * secure attribute of a single byte of it. Yet, since the current
+ * test does not deal with performance, let check the secure attribute
+ * of each byte of the buffer.
+ */
+ rc = TEE_CheckMemoryAccessRights(TEE_MEMORY_ACCESS_ANY_OWNER |
+ TEE_MEMORY_ACCESS_READ |
+ TEE_MEMORY_ACCESS_WRITE |
+ TEE_MEMORY_ACCESS_SECURE,
+ params[0].memref.buffer,
+ params[0].memref.size);
+ if (rc != TEE_SUCCESS) {
+ EMSG("TEE_CheckMemoryAccessRights(secure) failed %x", rc);
+ return rc;
+ }
+
+
+#ifdef CFG_CACHE_API
+ /*
+ * we should invalidate cache (here we assume buffer were not
+ * filled through cpu core caches. We flush buffers so that
+ * cache is not corrupted in cache target buffer not aligned
+ * on cache line size.
+ */
+ rc = TEE_CacheFlush(params[0].memref.buffer,
+ params[0].memref.size);
+ if (rc != TEE_SUCCESS) {
+ EMSG("TEE_CacheFlush(%p, %x) failed: 0x%x",
+ params[0].memref.buffer,
+ params[0].memref.size, rc);
+ return rc;
+ }
+#endif /* CFG_CACHE_API */
+
+ /* transform the data */
+ p = (unsigned char *)params[0].memref.buffer;
+ sz = params[0].memref.size;
+ for (; sz; sz--, p++)
+ *p = ~(*p) + 1;
+
+#ifdef CFG_CACHE_API
+ rc = TEE_CacheFlush(params[0].memref.buffer,
+ params[0].memref.size);
+ if (rc != TEE_SUCCESS) {
+ EMSG("TEE_CacheFlush(%p, %x) failed: 0x%x",
+ params[0].memref.buffer,
+ params[0].memref.size, rc);
+ return rc;
+ }
+#endif /* CFG_CACHE_API */
+
+ return rc;
+}
+
+static TEE_Result cmd_dump(uint32_t types,
+ TEE_Param params[TEE_NUM_PARAMS])
+{
+ TEE_Result rc;
+ const int sec_idx = 0; /* highlight secure buffer index */
+ const int ns_idx = 1; /* highlight nonsecure buffer index */
+
+ if (types != TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_MEMREF_OUTPUT,
+ TEE_PARAM_TYPE_NONE,
+ TEE_PARAM_TYPE_NONE))
+ return TEE_ERROR_BAD_PARAMETERS;
+
+ if (params[ns_idx].memref.size < params[sec_idx].memref.size)
+ return TEE_ERROR_SHORT_BUFFER;
+
+ /*
+ * We could rely on the TEE to provide consistent buffer/size values
+ * to reference a buffer with a unique and consistent secure attribute
+ * value. Hence it is safe enough (and more optimal) to test only the
+ * secure attribute of a single byte of it. Yet, since the current
+ * test does not deal with performance, let check the secure attribute
+ * of each byte of the buffer.
+ */
+ rc = TEE_CheckMemoryAccessRights(TEE_MEMORY_ACCESS_ANY_OWNER |
+ TEE_MEMORY_ACCESS_WRITE |
+ TEE_MEMORY_ACCESS_NONSECURE,
+ params[ns_idx].memref.buffer,
+ params[ns_idx].memref.size);
+ if (rc != TEE_SUCCESS) {
+ EMSG("TEE_CheckMemoryAccessRights(nsec) failed %x", rc);
+ return rc;
+ }
+
+ rc = TEE_CheckMemoryAccessRights(TEE_MEMORY_ACCESS_ANY_OWNER |
+ TEE_MEMORY_ACCESS_READ |
+ TEE_MEMORY_ACCESS_SECURE,
+ params[sec_idx].memref.buffer,
+ params[sec_idx].memref.size);
+ if (rc != TEE_SUCCESS) {
+ EMSG("TEE_CheckMemoryAccessRights(secure) failed %x", rc);
+ return rc;
+ }
+
+#ifdef CFG_CACHE_API
+ /*
+ * we should invalidate cache (here we assume buffer were not
+ * filled through cpu core caches. We flush buffers so that
+ * cache is not corrupted in cache target buffer not aligned
+ * on cache line size.
+ */
+ rc = TEE_CacheFlush(params[sec_idx].memref.buffer,
+ params[sec_idx].memref.size);
+ if (rc != TEE_SUCCESS) {
+ EMSG("TEE_CacheFlush(%p, %x) failed: 0x%x",
+ params[sec_idx].memref.buffer,
+ params[sec_idx].memref.size, rc);
+ return rc;
+ }
+#endif /* CFG_CACHE_API */
+
+ /* dump the data */
+ TEE_MemMove(params[ns_idx].memref.buffer,
+ params[sec_idx].memref.buffer,
+ params[sec_idx].memref.size);
+
+ return rc;
+}
+
+static TEE_Result cmd_invoke(uint32_t nParamTypes,
+ TEE_Param pParams[TEE_NUM_PARAMS],
+ uint32_t nCommandID)
+{
+ const TEE_UUID uuid = TA_SDP_BASIC_UUID;
+ static TEE_TASessionHandle sess = TEE_HANDLE_NULL;
+ uint32_t ret_orig;
+ TEE_Result res;
+
+ if (sess == TEE_HANDLE_NULL) {
+ res = TEE_OpenTASession(&uuid, 0, 0, NULL, &sess, &ret_orig);
+ if (res != TEE_SUCCESS) {
+ EMSG("SDP basic test TA: TEE_OpenTASession() FAILED \n");
+ goto cleanup_return;
+ }
+
+ }
+
+ res = TEE_InvokeTACommand(sess, 0, nCommandID, nParamTypes, pParams, &ret_orig);
+ if (res != TEE_SUCCESS) {
+ EMSG("SDP basic test TA: TEE_OpenTASession() FAILED %x/%d\n",
+ res, ret_orig);
+ }
+
+cleanup_return:
+ if (res != TEE_SUCCESS) {
+ TEE_CloseTASession(sess);
+ sess = TEE_HANDLE_NULL;
+ }
+ return res;
+}
+
+static TEE_Result cmd_invoke_pta(uint32_t nParamTypes,
+ TEE_Param pParams[TEE_NUM_PARAMS],
+ uint32_t nCommandID)
+{
+ const TEE_UUID uuid = PTA_INVOKE_TESTS_UUID;
+ static TEE_TASessionHandle sess = TEE_HANDLE_NULL;
+ uint32_t ret_orig;
+ TEE_Result res;
+
+ if (sess == TEE_HANDLE_NULL) {
+ res = TEE_OpenTASession(&uuid, 0, 0, NULL, &sess, &ret_orig);
+ if (res != TEE_SUCCESS) {
+ EMSG("SDP basic test TA: TEE_OpenTASession() FAILED \n");
+ goto cleanup_return;
+ }
+
+ }
+
+ res = TEE_InvokeTACommand(sess, 0, nCommandID, nParamTypes, pParams, &ret_orig);
+ if (res != TEE_SUCCESS) {
+ EMSG("SDP basic test TA: TEE_OpenTASession() FAILED %x/%d\n",
+ res, ret_orig);
+ }
+
+cleanup_return:
+ if (res != TEE_SUCCESS) {
+ TEE_CloseTASession(sess);
+ sess = TEE_HANDLE_NULL;
+ }
+ return res;
+}
+
+TEE_Result TA_CreateEntryPoint(void)
+{
+ return TEE_SUCCESS;
+}
+
+void TA_DestroyEntryPoint(void)
+{
+}
+
+TEE_Result TA_OpenSessionEntryPoint(uint32_t nParamTypes,
+ TEE_Param pParams[TEE_NUM_PARAMS],
+ void **ppSessionContext)
+{
+ (void)nParamTypes;
+ (void)pParams;
+ (void)ppSessionContext;
+ return TEE_SUCCESS;
+}
+
+void TA_CloseSessionEntryPoint(void *pSessionContext)
+{
+ (void)pSessionContext;
+}
+
+TEE_Result TA_InvokeCommandEntryPoint(void *pSessionContext,
+ uint32_t nCommandID, uint32_t nParamTypes,
+ TEE_Param pParams[TEE_NUM_PARAMS])
+{
+ (void)pSessionContext;
+
+ switch (nCommandID) {
+ case TA_SDP_BASIC_CMD_INJECT:
+ return cmd_inject(nParamTypes, pParams);
+ case TA_SDP_BASIC_CMD_TRANSFORM:
+ return cmd_transform(nParamTypes, pParams);
+ case TA_SDP_BASIC_CMD_DUMP:
+ return cmd_dump(nParamTypes, pParams);
+
+ case TA_SDP_BASIC_CMD_INVOKE_INJECT:
+ return cmd_invoke(nParamTypes, pParams, TA_SDP_BASIC_CMD_INJECT);
+ case TA_SDP_BASIC_CMD_INVOKE_TRANSFORM:
+ return cmd_invoke(nParamTypes, pParams, TA_SDP_BASIC_CMD_TRANSFORM);
+ case TA_SDP_BASIC_CMD_INVOKE_DUMP:
+ return cmd_invoke(nParamTypes, pParams, TA_SDP_BASIC_CMD_DUMP);
+
+ case TA_SDP_BASIC_CMD_PTA_INJECT:
+ return cmd_invoke_pta(nParamTypes, pParams, PTA_INVOKE_TESTS_CMD_COPY_NSEC_TO_SEC);
+ case TA_SDP_BASIC_CMD_PTA_TRANSFORM:
+ return cmd_invoke_pta(nParamTypes, pParams, PTA_INVOKE_TESTS_CMD_READ_MODIFY_SEC);
+ case TA_SDP_BASIC_CMD_PTA_DUMP:
+ return cmd_invoke_pta(nParamTypes, pParams, PTA_INVOKE_TESTS_CMD_COPY_SEC_TO_NSEC);
+
+ default:
+ return TEE_ERROR_BAD_PARAMETERS;
+ }
+}
diff --git a/demos/optee_test/ta/sha_perf/Android.mk b/demos/optee_test/ta/sha_perf/Android.mk
index 69ae414..6469095 100644
--- a/demos/optee_test/ta/sha_perf/Android.mk
+++ b/demos/optee_test/ta/sha_perf/Android.mk
@@ -1,42 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
-TDK_PATH:=../../../../ta_export
-TA_BINARY=614789f2-39c0-4ebf-b235-92b32ac107ed
-TA_CROSS_COMPILE=arm-linux-gnueabihf-
-TA_EXPORT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/system/lib/teetz
-OUTPUT_DIR := ../../out/ta/$(notdir $(LOCAL_PATH))
+LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-$(info $(shell make CROSS_COMPILE=$(TA_CROSS_COMPILE) -C $(LOCAL_PATH) O=$(OUTPUT_DIR) TA_DEV_KIT_DIR=$(TDK_PATH)))
-
-$(info $(shell if [ ! -e $(TA_EXPORT_DIR) ]; then mkdir -p $(TA_EXPORT_DIR); fi))
-
-ta_file := $(wildcard $(OUTPUT_DIR)/*.ta)
-ta_file := $(patsubst $(OUTPUT_DIR)/%,%,$(ta_file))
-
-ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY), true)
-$(info $(shell $(TA_SIGN_TOOL) --rootkey=$(TA_ROOT_KEY) --takey=$(TA_USER_KEY) \
- --in=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta \
- --out=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta ))
-endif
-
-$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib))
-$(info $(shell cp -vf $(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta $(PRODUCT_OUT)/obj/lib))
-
-LOCAL_MODULE := $(TA_BINARY)
-LOCAL_SRC_FILES := $(ta_file)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .ta
-LOCAL_MODULE_PATH := $(TA_EXPORT_DIR)
-LOCAL_STRIP_MODULE := false
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tee_sha_perf_ta
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-LOCAL_REQUIRED_MODULES := $(TA_BINARY)
-
-include $(BUILD_PHONY_PACKAGE)
+local_module := 614789f2-39c0-4ebf-b235-92b32ac107ed.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/sims/Android.mk b/demos/optee_test/ta/sims/Android.mk
index 19c06ae..52aa62f 100644
--- a/demos/optee_test/ta/sims/Android.mk
+++ b/demos/optee_test/ta/sims/Android.mk
@@ -1,42 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
-TDK_PATH:=../../../../ta_export
-TA_BINARY=e6a33ed4-562b-463a-bb7e-ff5e15a493c8
-TA_CROSS_COMPILE=arm-linux-gnueabihf-
-TA_EXPORT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/system/lib/teetz
-OUTPUT_DIR := ../../out/ta/$(notdir $(LOCAL_PATH))
+LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-$(info $(shell make CROSS_COMPILE=$(TA_CROSS_COMPILE) -C $(LOCAL_PATH) O=$(OUTPUT_DIR) TA_DEV_KIT_DIR=$(TDK_PATH)))
-
-$(info $(shell if [ ! -e $(TA_EXPORT_DIR) ]; then mkdir -p $(TA_EXPORT_DIR); fi))
-
-ta_file := $(wildcard $(OUTPUT_DIR)/*.ta)
-ta_file := $(patsubst $(OUTPUT_DIR)/%,%,$(ta_file))
-
-ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY), true)
-$(info $(shell $(TA_SIGN_TOOL) --rootkey=$(TA_ROOT_KEY) --takey=$(TA_USER_KEY) \
- --in=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta \
- --out=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta ))
-endif
-
-$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib))
-$(info $(shell cp -vf $(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta $(PRODUCT_OUT)/obj/lib))
-
-LOCAL_MODULE := $(TA_BINARY)
-LOCAL_SRC_FILES := $(ta_file)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .ta
-LOCAL_MODULE_PATH := $(TA_EXPORT_DIR)
-LOCAL_STRIP_MODULE := false
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tee_sims_ta
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-LOCAL_REQUIRED_MODULES := $(TA_BINARY)
-
-include $(BUILD_PHONY_PACKAGE)
+local_module := e6a33ed4-562b-463a-bb7e-ff5e15a493c8.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/socket/Android.mk b/demos/optee_test/ta/socket/Android.mk
new file mode 100644
index 0000000..446afda
--- a/dev/null
+++ b/demos/optee_test/ta/socket/Android.mk
@@ -0,0 +1,4 @@
+LOCAL_PATH := $(call my-dir)
+
+local_module := 873bcd08-c2c3-11e6-a937-d0bf9c45c61c.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/socket/Makefile b/demos/optee_test/ta/socket/Makefile
new file mode 100644
index 0000000..48db92a
--- a/dev/null
+++ b/demos/optee_test/ta/socket/Makefile
@@ -0,0 +1,2 @@
+BINARY = 873bcd08-c2c3-11e6-a937-d0bf9c45c61c
+include ../ta_common.mk
diff --git a/demos/optee_test/ta/socket/include/ta_socket.h b/demos/optee_test/ta/socket/include/ta_socket.h
new file mode 100644
index 0000000..2e36c01
--- a/dev/null
+++ b/demos/optee_test/ta/socket/include/ta_socket.h
@@ -0,0 +1,99 @@
+/*
+ * 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.
+ */
+
+#ifndef __TA_SOCKET_H
+#define __TA_SOCKET_H
+
+#define TA_SOCKET_UUID { 0x873bcd08, 0xc2c3, 0x11e6, { \
+ 0xa9, 0x37, 0xd0, 0xbf, 0x9c, 0x45, 0xc6, 0x1c } }
+
+/*
+ * Opens a TCP socket and returns an opaque handle
+ *
+ * [in] params[0].value.a ipVersion
+ * [in] params[0].value.b server port
+ * [in] params[1].memref server address
+ * [out] params[2].memref handle
+ * [out] params[3].value.a protocol error
+ */
+#define TA_SOCKET_CMD_TCP_OPEN 0
+
+/*
+ * Opens a UDP socket and returns an opaque handle
+ *
+ * [in] params[0].value.a ipVersion
+ * [in] params[0].value.b server port
+ * [in] params[1].memref server address
+ * [out] params[2].memref handle
+ * [out] params[3].value.a protocol error
+ */
+#define TA_SOCKET_CMD_UDP_OPEN 1
+
+/*
+ * Closes a socket
+ *
+ * [in] params[0].memref handle
+ */
+#define TA_SOCKET_CMD_CLOSE 2
+
+/*
+ * Send data on socket
+ *
+ * [in] params[0].memref handle
+ * [in] params[1].memref data
+ * [in] params[2].value.a timeout
+ * [out] params[2].value.b sent bytes
+ */
+#define TA_SOCKET_CMD_SEND 3
+
+/*
+ * Receive data on socket
+ *
+ * [in] params[0].memref handle
+ * [out] params[1].memref data
+ * [in] params[2].value.a timeout
+ */
+#define TA_SOCKET_CMD_RECV 4
+
+/*
+ * Retrieve protocol error from socket
+ *
+ * [in] params[0].memref handle
+ * [out] params[1].value.a error code
+ */
+#define TA_SOCKET_CMD_ERROR 5
+
+/*
+ * Ioctl on socket
+ *
+ * [in] params[0].memref handle
+ * [in/out] params[1].memref data
+ * [in] params[2].value.a command code
+ */
+#define TA_SOCKET_CMD_IOCTL 6
+
+#endif /*__TA_SOCKET_H*/
diff --git a/demos/optee_test/ta/socket/include/user_ta_header_defines.h b/demos/optee_test/ta/socket/include/user_ta_header_defines.h
new file mode 100644
index 0000000..6a2397f
--- a/dev/null
+++ b/demos/optee_test/ta/socket/include/user_ta_header_defines.h
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+
+#ifndef USER_TA_HEADER_DEFINES_H
+#define USER_TA_HEADER_DEFINES_H
+
+#include <ta_socket.h>
+#include <user_ta_header.h>
+
+#define TA_UUID TA_SOCKET_UUID
+
+#define TA_FLAGS ( TA_FLAG_EXEC_DDR | TA_FLAG_MULTI_SESSION)
+#define TA_STACK_SIZE (2 * 1024)
+#define TA_DATA_SIZE (32 * 1024)
+
+#endif /*USER_TA_HEADER_DEFINES_H*/
diff --git a/demos/optee_test/ta/socket/sub.mk b/demos/optee_test/ta/socket/sub.mk
new file mode 100644
index 0000000..d5e3f32
--- a/dev/null
+++ b/demos/optee_test/ta/socket/sub.mk
@@ -0,0 +1,2 @@
+global-incdirs-y += include
+srcs-y += ta_entry.c
diff --git a/demos/optee_test/ta/socket/ta_entry.c b/demos/optee_test/ta/socket/ta_entry.c
new file mode 100644
index 0000000..3fb6658
--- a/dev/null
+++ b/demos/optee_test/ta/socket/ta_entry.c
@@ -0,0 +1,285 @@
+/*
+ * 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 <stdlib.h>
+#include <string.h>
+#include <ta_socket.h>
+#include <tee_internal_api.h>
+#include <tee_isocket.h>
+#include <tee_tcpsocket.h>
+#include <tee_udpsocket.h>
+#include <trace.h>
+
+TEE_Result TA_CreateEntryPoint(void)
+{
+ return TEE_SUCCESS;
+}
+
+void TA_DestroyEntryPoint(void)
+{
+}
+
+TEE_Result TA_OpenSessionEntryPoint(uint32_t param_types,
+ TEE_Param params[4],
+ void **session_ctx)
+{
+ (void)param_types;
+ (void)params;
+ (void)session_ctx;
+ return TEE_SUCCESS;
+}
+
+void TA_CloseSessionEntryPoint(void *session_ctx)
+{
+ (void)session_ctx;
+}
+
+struct sock_handle {
+ TEE_iSocketHandle ctx;
+ TEE_iSocket *socket;
+};
+
+static TEE_Result ta_entry_tcp_open(uint32_t param_types, TEE_Param params[4])
+{
+ TEE_Result res;
+ struct sock_handle h;
+ TEE_tcpSocket_Setup setup;
+ uint32_t req_param_types =
+ TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
+ TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_MEMREF_OUTPUT,
+ TEE_PARAM_TYPE_VALUE_OUTPUT);
+
+ if (param_types != req_param_types) {
+ EMSG("got param_types 0x%x, expected 0x%x",
+ param_types, req_param_types);
+ return TEE_ERROR_BAD_PARAMETERS;
+ }
+
+ if (params[2].memref.size < sizeof(struct sock_handle)) {
+ params[2].memref.size = sizeof(struct sock_handle);
+ return TEE_ERROR_SHORT_BUFFER;
+ }
+
+ setup.ipVersion = params[0].value.a;
+ setup.server_port = params[0].value.b;
+ setup.server_addr = strndup(params[1].memref.buffer,
+ params[1].memref.size);
+ if (!setup.server_addr)
+ return TEE_ERROR_OUT_OF_MEMORY;
+
+ h.socket = TEE_tcpSocket;
+ res = h.socket->open(&h.ctx, &setup, &params[3].value.a);
+ free(setup.server_addr);
+ if (res == TEE_SUCCESS) {
+ memcpy(params[2].memref.buffer, &h, sizeof(h));
+ params[2].memref.size = sizeof(h);
+ }
+ return res;
+}
+
+static TEE_Result ta_entry_udp_open(uint32_t param_types, TEE_Param params[4])
+{
+ TEE_Result res;
+ struct sock_handle h;
+ TEE_udpSocket_Setup setup;
+ uint32_t req_param_types =
+ TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
+ TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_MEMREF_OUTPUT,
+ TEE_PARAM_TYPE_VALUE_OUTPUT);
+
+ if (param_types != req_param_types) {
+ EMSG("got param_types 0x%x, expected 0x%x",
+ param_types, req_param_types);
+ return TEE_ERROR_BAD_PARAMETERS;
+ }
+
+ if (params[2].memref.size < sizeof(struct sock_handle)) {
+ params[2].memref.size = sizeof(struct sock_handle);
+ return TEE_ERROR_SHORT_BUFFER;
+ }
+
+ setup.ipVersion = params[0].value.a;
+ setup.server_port = params[0].value.b;
+ setup.server_addr = strndup(params[1].memref.buffer,
+ params[1].memref.size);
+ if (!setup.server_addr)
+ return TEE_ERROR_OUT_OF_MEMORY;
+
+ h.socket = TEE_udpSocket;
+ res = h.socket->open(&h.ctx, &setup, &params[3].value.a);
+ free(setup.server_addr);
+ if (res == TEE_SUCCESS) {
+ memcpy(params[2].memref.buffer, &h, sizeof(h));
+ params[2].memref.size = sizeof(h);
+ }
+ return res;
+}
+
+static TEE_Result ta_entry_close(uint32_t param_types, TEE_Param params[4])
+{
+ struct sock_handle *h;
+ uint32_t req_param_types =
+ TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE,
+ TEE_PARAM_TYPE_NONE);
+
+ if (param_types != req_param_types) {
+ EMSG("got param_types 0x%x, expected 0x%x",
+ param_types, req_param_types);
+ return TEE_ERROR_BAD_PARAMETERS;
+ }
+
+ if (params[0].memref.size != sizeof(struct sock_handle))
+ return TEE_ERROR_BAD_PARAMETERS;
+
+ h = params[0].memref.buffer;
+ return h->socket->close(h->ctx);
+}
+
+static TEE_Result ta_entry_send(uint32_t param_types, TEE_Param params[4])
+{
+ struct sock_handle *h;
+ uint32_t req_param_types =
+ TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_VALUE_INOUT,
+ TEE_PARAM_TYPE_NONE);
+
+ if (param_types != req_param_types) {
+ EMSG("got param_types 0x%x, expected 0x%x",
+ param_types, req_param_types);
+ return TEE_ERROR_BAD_PARAMETERS;
+ }
+
+ if (params[0].memref.size != sizeof(*h))
+ return TEE_ERROR_BAD_PARAMETERS;
+
+ h = params[0].memref.buffer;
+ params[2].value.b = params[1].memref.size;
+ return h->socket->send(h->ctx, params[1].memref.buffer,
+ &params[2].value.b, params[2].value.a);
+}
+
+static TEE_Result ta_entry_recv(uint32_t param_types, TEE_Param params[4])
+{
+ struct sock_handle *h;
+ uint32_t req_param_types =
+ TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_MEMREF_OUTPUT,
+ TEE_PARAM_TYPE_VALUE_INPUT,
+ TEE_PARAM_TYPE_NONE);
+
+ if (param_types != req_param_types) {
+ EMSG("got param_types 0x%x, expected 0x%x",
+ param_types, req_param_types);
+ return TEE_ERROR_BAD_PARAMETERS;
+ }
+
+ if (params[0].memref.size != sizeof(struct sock_handle))
+ return TEE_ERROR_BAD_PARAMETERS;
+
+ h = params[0].memref.buffer;
+ return h->socket->recv(h->ctx, params[1].memref.buffer,
+ &params[1].memref.size, params[2].value.a);
+}
+
+static TEE_Result ta_entry_error(uint32_t param_types, TEE_Param params[4])
+{
+ struct sock_handle *h;
+ uint32_t req_param_types =
+ TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_VALUE_OUTPUT,
+ TEE_PARAM_TYPE_NONE,
+ TEE_PARAM_TYPE_NONE);
+
+ if (param_types != req_param_types) {
+ EMSG("got param_types 0x%x, expected 0x%x",
+ param_types, req_param_types);
+ return TEE_ERROR_BAD_PARAMETERS;
+ }
+
+ if (params[0].memref.size != sizeof(struct sock_handle))
+ return TEE_ERROR_BAD_PARAMETERS;
+
+ h = params[0].memref.buffer;
+ params[1].value.a = h->socket->error(h->ctx);
+ return TEE_SUCCESS;
+}
+
+static TEE_Result ta_entry_ioctl(uint32_t param_types, TEE_Param params[4])
+{
+ struct sock_handle *h;
+ uint32_t req_param_types =
+ TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_MEMREF_INOUT,
+ TEE_PARAM_TYPE_VALUE_INPUT,
+ TEE_PARAM_TYPE_NONE);
+
+ if (param_types != req_param_types) {
+ EMSG("got param_types 0x%x, expected 0x%x",
+ param_types, req_param_types);
+ return TEE_ERROR_BAD_PARAMETERS;
+ }
+
+ if (params[0].memref.size != sizeof(struct sock_handle))
+ return TEE_ERROR_BAD_PARAMETERS;
+
+ h = params[0].memref.buffer;
+ return h->socket->ioctl(h->ctx, params[2].value.a,
+ params[1].memref.buffer,
+ &params[1].memref.size);
+}
+
+
+
+TEE_Result TA_InvokeCommandEntryPoint(void *session_ctx,
+ uint32_t cmd_id, uint32_t param_types,
+ TEE_Param params[4])
+{
+ (void)session_ctx;
+
+ switch (cmd_id) {
+ case TA_SOCKET_CMD_TCP_OPEN:
+ return ta_entry_tcp_open(param_types, params);
+ case TA_SOCKET_CMD_UDP_OPEN:
+ return ta_entry_udp_open(param_types, params);
+ case TA_SOCKET_CMD_CLOSE:
+ return ta_entry_close(param_types, params);
+ case TA_SOCKET_CMD_SEND:
+ return ta_entry_send(param_types, params);
+ case TA_SOCKET_CMD_RECV:
+ return ta_entry_recv(param_types, params);
+ case TA_SOCKET_CMD_ERROR:
+ return ta_entry_error(param_types, params);
+ case TA_SOCKET_CMD_IOCTL:
+ return ta_entry_ioctl(param_types, params);
+ default:
+ return TEE_ERROR_BAD_PARAMETERS;
+ }
+}
diff --git a/demos/optee_test/ta/storage/Android.mk b/demos/optee_test/ta/storage/Android.mk
index e652634..c19b55d 100644
--- a/demos/optee_test/ta/storage/Android.mk
+++ b/demos/optee_test/ta/storage/Android.mk
@@ -1,42 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
-TDK_PATH:=../../../../ta_export
-TA_BINARY=b689f2a7-8adf-477a-9f99-32e90c0ad0a2
-TA_CROSS_COMPILE=arm-linux-gnueabihf-
-TA_EXPORT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/system/lib/teetz
-OUTPUT_DIR := ../../out/ta/$(notdir $(LOCAL_PATH))
+LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-$(info $(shell make CROSS_COMPILE=$(TA_CROSS_COMPILE) -C $(LOCAL_PATH) O=$(OUTPUT_DIR) TA_DEV_KIT_DIR=$(TDK_PATH)))
-
-$(info $(shell if [ ! -e $(TA_EXPORT_DIR) ]; then mkdir -p $(TA_EXPORT_DIR); fi))
-
-ta_file := $(wildcard $(OUTPUT_DIR)/*.ta)
-ta_file := $(patsubst $(OUTPUT_DIR)/%,%,$(ta_file))
-
-ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY), true)
-$(info $(shell $(TA_SIGN_TOOL) --rootkey=$(TA_ROOT_KEY) --takey=$(TA_USER_KEY) \
- --in=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta \
- --out=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta ))
-endif
-
-$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib))
-$(info $(shell cp -vf $(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta $(PRODUCT_OUT)/obj/lib))
-
-LOCAL_MODULE := $(TA_BINARY)
-LOCAL_SRC_FILES := $(ta_file)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .ta
-LOCAL_MODULE_PATH := $(TA_EXPORT_DIR)
-LOCAL_STRIP_MODULE := false
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tee_storage_ta
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-LOCAL_REQUIRED_MODULES := $(TA_BINARY)
-
-include $(BUILD_PHONY_PACKAGE)
+local_module := b689f2a7-8adf-477a-9f99-32e90c0ad0a2.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/storage2/Android.mk b/demos/optee_test/ta/storage2/Android.mk
index bebc7d3..b123bf8 100644
--- a/demos/optee_test/ta/storage2/Android.mk
+++ b/demos/optee_test/ta/storage2/Android.mk
@@ -1,42 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
-TDK_PATH:=../../../../ta_export
-TA_BINARY=731e279e-aafb-4575-a771-38caa6f0cca6
-TA_CROSS_COMPILE=arm-linux-gnueabihf-
-TA_EXPORT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/system/lib/teetz
-OUTPUT_DIR := ../../out/ta/$(notdir $(LOCAL_PATH))
+LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-$(info $(shell make CROSS_COMPILE=$(TA_CROSS_COMPILE) -C $(LOCAL_PATH) O=$(OUTPUT_DIR) TA_DEV_KIT_DIR=$(TDK_PATH)))
-
-$(info $(shell if [ ! -e $(TA_EXPORT_DIR) ]; then mkdir -p $(TA_EXPORT_DIR); fi))
-
-ta_file := $(wildcard $(OUTPUT_DIR)/*.ta)
-ta_file := $(patsubst $(OUTPUT_DIR)/%,%,$(ta_file))
-
-ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY), true)
-$(info $(shell $(TA_SIGN_TOOL) --rootkey=$(TA_ROOT_KEY) --takey=$(TA_USER_KEY) \
- --in=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta \
- --out=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta ))
-endif
-
-$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib))
-$(info $(shell cp -vf $(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta $(PRODUCT_OUT)/obj/lib))
-
-LOCAL_MODULE := $(TA_BINARY)
-LOCAL_SRC_FILES := $(ta_file)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .ta
-LOCAL_MODULE_PATH := $(TA_EXPORT_DIR)
-LOCAL_STRIP_MODULE := false
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tee_storage2_ta
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-LOCAL_REQUIRED_MODULES := $(TA_BINARY)
-
-include $(BUILD_PHONY_PACKAGE)
+local_module := 731e279e-aafb-4575-a771-38caa6f0cca6.ta
+include $(BUILD_OPTEE_MK)
diff --git a/demos/optee_test/ta/storage_benchmark/Android.mk b/demos/optee_test/ta/storage_benchmark/Android.mk
index 9a672c4..c3eeb76 100644
--- a/demos/optee_test/ta/storage_benchmark/Android.mk
+++ b/demos/optee_test/ta/storage_benchmark/Android.mk
@@ -1,42 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
-TDK_PATH:=../../../../ta_export
-TA_BINARY=f157cda0-550c-11e5-a6fa-0002a5d5c51b
-TA_CROSS_COMPILE=arm-linux-gnueabihf-
-TA_EXPORT_DIR := out/target/product/$(TARGET_BOOTLOADER_BOARD_NAME)/system/lib/teetz
-OUTPUT_DIR := ../../out/ta/$(notdir $(LOCAL_PATH))
+LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-$(info $(shell make CROSS_COMPILE=$(TA_CROSS_COMPILE) -C $(LOCAL_PATH) O=$(OUTPUT_DIR) TA_DEV_KIT_DIR=$(TDK_PATH)))
-
-$(info $(shell if [ ! -e $(TA_EXPORT_DIR) ]; then mkdir -p $(TA_EXPORT_DIR); fi))
-
-ta_file := $(wildcard $(OUTPUT_DIR)/*.ta)
-ta_file := $(patsubst $(OUTPUT_DIR)/%,%,$(ta_file))
-
-ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY), true)
-$(info $(shell $(TA_SIGN_TOOL) --rootkey=$(TA_ROOT_KEY) --takey=$(TA_USER_KEY) \
- --in=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta \
- --out=$(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta ))
-endif
-
-$(info $(shell mkdir -p $(PRODUCT_OUT)/obj/lib))
-$(info $(shell cp -vf $(LOCAL_PATH)/$(OUTPUT_DIR)/$(TA_BINARY).ta $(PRODUCT_OUT)/obj/lib))
-
-LOCAL_MODULE := $(TA_BINARY)
-LOCAL_SRC_FILES := $(ta_file)
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .ta
-LOCAL_MODULE_PATH := $(TA_EXPORT_DIR)
-LOCAL_STRIP_MODULE := false
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tee_storage_benchmark_ta
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-
-LOCAL_REQUIRED_MODULES := $(TA_BINARY)
-
-include $(BUILD_PHONY_PACKAGE)
+local_module := f157cda0-550c-11e5-a6fa-0002a5d5c51b.ta
+include $(BUILD_OPTEE_MK)