author | Pengguang 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) |
commit | 6ebc31a619a0013f8b6c03076bbe77ef877cf5ab (patch) | |
tree | 01b44afceb28c8216fd673d474eaaca2cbf25bdf | |
parent | d4e2a067357ca745d928a06f6ce70bce0c96aae2 (diff) | |
download | tdk-6ebc31a619a0013f8b6c03076bbe77ef877cf5ab.zip tdk-6ebc31a619a0013f8b6c03076bbe77ef877cf5ab.tar.gz tdk-6ebc31a619a0013f8b6c03076bbe77ef877cf5ab.tar.bz2 |
update optee_test to 2.4.0
Change-Id: I7fa1e182a58a4a298adf2e172a215a35d6f8d5f4
commit: 170a1ee60a98b407790d97dc682568981d344ca3
revert: cc923db2ebb03e98cf703b91c3c6c8e074ecdf06
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, ¶ms[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, ¶ms[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, + ¶ms[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, + ¶ms[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, + ¶ms[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) |