From 63ec79ce65ed947b3fafdb98a4f439b059bba12d Mon Sep 17 00:00:00 2001 From: Lukasz Kostyra Date: Thu, 20 Jul 2017 14:49:50 +0200 Subject: [PATCH] Create TEF Simulator devkit package, make helloworld use it tee_internal_api.h was additionally modified to fit GP API specification. Change-Id: Ibbf7a23b0be5548064df6b6d404fc343070b4f6e --- CMakeLists.txt | 17 ++---- PackageMaker/CMakeLists.txt | 25 ++++++++ PackageMaker/TAPackageMaker | Bin 0 -> 191424 bytes PackageMaker/TA_PackageBuilder.sh | 91 +++++++++++++++++++++++++++++ TEECLib/CMakeLists.txt | 7 ++- TEEStub/CMakeLists.txt | 7 ++- cmake/CMakeLists.txt | 24 ++++++++ cmake/TEFSimulatorDevkit.cmake | 32 +++++++++++ helloworld/CMakeLists.txt | 57 ++++++++++++------- helloworld/ta/hello_world.c | 4 +- include/include/tee_internal_api.h | 4 +- log/CMakeLists.txt | 2 +- osal/CMakeLists.txt | 2 +- packaging/tef-simulator-helloworld.spec | 54 ++++++++++++++++++ packaging/tef-simulator.spec | 98 ++++++++++++++++++++++++++------ pkgconfig/CMakeLists.txt | 26 +++++++++ pkgconfig/tef-simulator-devkit.pc.in | 11 ++++ ssflib/CMakeLists.txt | 2 +- 18 files changed, 404 insertions(+), 59 deletions(-) create mode 100644 PackageMaker/CMakeLists.txt create mode 100755 PackageMaker/TAPackageMaker create mode 100755 PackageMaker/TA_PackageBuilder.sh create mode 100644 cmake/CMakeLists.txt create mode 100644 cmake/TEFSimulatorDevkit.cmake create mode 100644 packaging/tef-simulator-helloworld.spec create mode 100644 pkgconfig/CMakeLists.txt create mode 100644 pkgconfig/tef-simulator-devkit.pc.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 38e1910..53d03f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,10 +63,6 @@ SET(TARGET_TEF_SIMULATOR_LOG ${TARGET_TEF_SIMULATOR}-log) SET(TARGET_TEF_SIMULATOR_OSAL ${TARGET_TEF_SIMULATOR}-osal) SET(TARGET_TEF_SIMULATOR_DAEMON ${TARGET_TEF_SIMULATOR}-daemon) SET(TARGET_TEF_SIMULATOR_SSFLIB ${TARGET_TEF_SIMULATOR}-ssflib) -SET(TARGET_TEF_SIMULATOR_HELLO_WORLD_CA ${TARGET_TEF_SIMULATOR}-helloworld) - -# helloworld TA needs to be named after its UUID -SET(TARGET_TEF_SIMULATOR_HELLO_WORLD_TA 00000000-0000-0000-0000-112233445566) # below targets need different names due to linking with CAs and TAs (libteec for client) SET(TARGET_TEF_SIMULATOR_TEEC_LIB teec) @@ -84,6 +80,9 @@ SET(LOG_PATH ${TEF_SIMULATOR_ROOT_PATH}/log) # osal SET(OSAL_PATH ${TEF_SIMULATOR_ROOT_PATH}/osal) +# PackageMaker +SET(PACKAGE_MAKER_PATH ${TEF_SIMULATOR_ROOT_PATH}/PackageMaker) + # ssflib SET(SSFLIB_PATH ${TEF_SIMULATOR_ROOT_PATH}/ssflib) SET(SSFLIB_DEP_PATH ${SSFLIB_PATH}/dep) @@ -101,18 +100,14 @@ SET(TEEC_LIB_PATH ${TEF_SIMULATOR_ROOT_PATH}/TEECLib) # TEEStub SET(TEE_STUB_PATH ${TEF_SIMULATOR_ROOT_PATH}/TEEStub) -# helloworld -SET(HELLO_WORLD_PATH ${TEF_SIMULATOR_ROOT_PATH}/helloworld) -SET(HELLO_WORLD_TA_PATH ${HELLO_WORLD_PATH}/ta) -SET(HELLO_WORLD_CA_PATH ${HELLO_WORLD_PATH}/host) - - ############################# subdirectories ################################## +ADD_SUBDIRECTORY(cmake) ADD_SUBDIRECTORY(log) ADD_SUBDIRECTORY(osal) +ADD_SUBDIRECTORY(PackageMaker) +ADD_SUBDIRECTORY(pkgconfig) ADD_SUBDIRECTORY(simulatordaemon) ADD_SUBDIRECTORY(ssflib) ADD_SUBDIRECTORY(TEECLib) ADD_SUBDIRECTORY(TEEStub) -ADD_SUBDIRECTORY(helloworld) diff --git a/PackageMaker/CMakeLists.txt b/PackageMaker/CMakeLists.txt new file mode 100644 index 0000000..3521d3e --- /dev/null +++ b/PackageMaker/CMakeLists.txt @@ -0,0 +1,25 @@ +# Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# @file +# @author Lukasz Kostyra (l.kostyra@samsung.com) +# @brief CMakeLists for tef-simulator TA Package Maker +# + +SET(PACKAGE_MAKER_BINARIES + ${PACKAGE_MAKER_PATH}/TA_PackageBuilder.sh + ${PACKAGE_MAKER_PATH}/TAPackageMaker + ) + +INSTALL(PROGRAMS ${PACKAGE_MAKER_BINARIES} DESTINATION ${BIN_DIR}) diff --git a/PackageMaker/TAPackageMaker b/PackageMaker/TAPackageMaker new file mode 100755 index 0000000000000000000000000000000000000000..a478dba44a23aeb23f71422e3a9e477221ad0aa2 GIT binary patch literal 191424 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 E0kWrq_W%F@ literal 0 HcmV?d00001 diff --git a/PackageMaker/TA_PackageBuilder.sh b/PackageMaker/TA_PackageBuilder.sh new file mode 100755 index 0000000..df0b5ad --- /dev/null +++ b/PackageMaker/TA_PackageBuilder.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +TA_SYS_PASS=$1 +INPUT_IMAGE_NAME=$2 +INPUT_IMAGE_MANIFEST=$3 + +TARGET_SHA_TYPE=sha256 +TARGET_PAGE_SIZE=2048 + +EXE_PATH=$(readlink -f $(dirname "$0")) + +cookie=~/cookies.txt + +function func_make_package() +{ + echo "Making package" + + if [ "$TA_LAUNCH_MODE" = "debug" ] + then + #TA Packaging + $TA_SYS_PASS/TAPackageMaker $INPUT_IMAGE_NAME $INPUT_IMAGE_MANIFEST $TA_CERTIFICATE $TA_PRIVATE_KEY + elif [ "$TA_LAUNCH_MODE" = "release" ] + then + echo "Release building unimplemented" + #TA Packaging + $TA_SYS_PASS/TAPackageMaker $INPUT_IMAGE_NAME $INPUT_IMAGE_MANIFEST $TA_CERTIFICATE $TA_PRIVATE_KEY + else + echo "LAUNCH_MODE Error.!!!" + exit -1 + fi + +} + +function func_create_certificate() +{ + # Generate private key + openssl genrsa -out $TA_PRIVATE_KEY 2048 + # Generate CSR + openssl req -new -key $TA_PRIVATE_KEY -out $TA_CERTIFICATE_CSR -subj "/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd" + + if [ "$TA_LAUNCH_MODE" = "debug" ] + then + #generate self-signed certificate + openssl x509 -req -days 3650 -in $TA_CERTIFICATE_CSR -extensions v3_ca -signkey $TA_PRIVATE_KEY -out $TA_CERTIFICATE + elif [ "$TA_LAUNCH_MODE" = "release" ] + then + echo "Need to implement.." + #generate self-signed certificate + openssl x509 -req -days 3650 -in $TA_CERTIFICATE_CSR -extensions v3_ca -signkey $TA_PRIVATE_KEY -out $TA_CERTIFICATE + else + echo "LAUNCH_MODE Error.!!!" + exit -1 + fi +} + +function func_package_build() +{ + # parse manifest + export TA_LAUNCH_MODE=$(grep -oP '(?<=launchMode).*(?=")' $INPUT_IMAGE_MANIFEST | grep -oP '(?<=").*(?=)') + + export TA_PRIVILEGE=$(grep -oP '(?<=privilege name).*(?=/>)' $INPUT_IMAGE_MANIFEST | grep -oP '(?<=").*(?=")') + + if [ "$TA_LAUNCH_MODE" = "debug" ] + then + TA_KEYFOLDER=keystore/debug/ + elif [ "$TA_LAUNCH_MODE" = "release" ] + then + TA_KEYFOLDER=keystore/$TA_PRIVILEGE/ + else + echo "LAUNCH_MODE Error.!!!" + exit -1 + fi + + export TA_PRIVATE_KEY=$TA_KEYFOLDER/Kaa_private.pem + export TA_CERTIFICATE_CSR=$TA_KEYFOLDER/Kaa_csr.pem + export TA_CERTIFICATE=$TA_KEYFOLDER/Kaa_cert.pem + + mkdir -p $TA_KEYFOLDER + + if [ -f $TA_KEYFOLDER/Kaa_cert.pem ] + then + echo "Certificate exists." + else + echo "Certificate does NOT exist." + func_create_certificate + fi + + func_make_package +} + +func_package_build diff --git a/TEECLib/CMakeLists.txt b/TEECLib/CMakeLists.txt index 318b9da..bc1e195 100644 --- a/TEECLib/CMakeLists.txt +++ b/TEECLib/CMakeLists.txt @@ -24,6 +24,10 @@ SET(TEEC_LIB_SOURCES ${TEEC_LIB_PATH}/src/teec_connection.c ) +SET(TEEC_LIB_HEADERS + ${TEF_SIMULATOR_INCLUDE_PATH}/include/tee_client_api.h + ) + ADD_LIBRARY(${TARGET_TEF_SIMULATOR_TEEC_LIB} SHARED ${TEEC_LIB_SOURCES} ) @@ -46,4 +50,5 @@ TARGET_LINK_LIBRARIES(${TARGET_TEF_SIMULATOR_TEEC_LIB} ${TARGET_TEF_SIMULATOR_LOG} ) -INSTALL(TARGETS ${TARGET_TEF_SIMULATOR_TEEC_LIB} DESTINATION ${LIB_INSTALL_DIR}) +INSTALL(TARGETS ${TARGET_TEF_SIMULATOR_TEEC_LIB} DESTINATION ${LIB_DIR}) +INSTALL(FILES ${TEEC_LIB_HEADERS} DESTINATION ${INCLUDE_DIR}) diff --git a/TEEStub/CMakeLists.txt b/TEEStub/CMakeLists.txt index d63c1aa..d723930 100644 --- a/TEEStub/CMakeLists.txt +++ b/TEEStub/CMakeLists.txt @@ -45,6 +45,10 @@ SET(TEE_STUB_SOURCES ${TEE_STUB_PATH}/TEEStubServer/TADebug.cpp ) +SET(TEE_STUB_HEADERS + ${TEF_SIMULATOR_INCLUDE_PATH}/include/tee_internal_api.h + ) + ADD_LIBRARY(${TARGET_TEF_SIMULATOR_TEE_STUB} STATIC ${TEE_STUB_SOURCES} ) @@ -65,4 +69,5 @@ TARGET_LINK_LIBRARIES(${TARGET_TEF_SIMULATOR_TEE_STUB} boost_system boost_thread ) -INSTALL(TARGETS ${TARGET_TEF_SIMULATOR_TEE_STUB} DESTINATION ${LIB_INSTALL_DIR}) +INSTALL(TARGETS ${TARGET_TEF_SIMULATOR_TEE_STUB} DESTINATION ${LIB_DIR}) +INSTALL(FILES ${TEE_STUB_HEADERS} DESTINATION ${INCLUDE_DIR}) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt new file mode 100644 index 0000000..fba987a --- /dev/null +++ b/cmake/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# @file CMakeLists.txt +# @author Lukasz Kostyra (l.kostyra@samsung.com) +# @brief CMakeLists file for TEF Simulator CMake Devkit module +# + +INSTALL(FILES + ${TEF_SIMULATOR_ROOT_PATH}/cmake/TEFSimulatorDevkit.cmake + DESTINATION + ${DATA_DIR}/cmake/Modules/ + ) diff --git a/cmake/TEFSimulatorDevkit.cmake b/cmake/TEFSimulatorDevkit.cmake new file mode 100644 index 0000000..4b70da5 --- /dev/null +++ b/cmake/TEFSimulatorDevkit.cmake @@ -0,0 +1,32 @@ +# @file +# @author Lukasz Kostyra (l.kostyra@samsung.com) +# @brief CMake TA development kit module + +MESSAGE(STATUS "TEF Simulator Devkit included!") + +FIND_PROGRAM(TA_PACKAGE_MAKER TAPackageMaker PATHS /usr/bin) +FIND_PROGRAM(TA_PACKAGE_BUILDER TA_PackageBuilder.sh PATHS /usr/bin) + +IF(NOT TA_PACKAGE_MAKER) + MESSAGE(FATAL_ERROR "TAPacakgeMaker tool not found.") +ENDIF() + +IF(NOT TA_PACKAGE_BUILDER) + MESSAGE(FATAL_ERROR "TA_PackageBuilder.sh script not found.") +ENDIF() + +MACRO(TEF_GENERATE_TA_IMAGE TargetName TAManifestFile TAImageName) + SET(STRIPPED_TARGET_FILE ${CMAKE_CURRENT_BINARY_DIR}/${TargetName}.strip) + + ADD_CUSTOM_COMMAND(TARGET ${TargetName} POST_BUILD + COMMAND ${CMAKE_STRIP} --strip-unneeded -o ${STRIPPED_TARGET_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${TargetName} + COMMENT "Stripping image") + + STRING(TOUPPER "${TargetName}" TargetOutName) + STRING(REPLACE "-" "" TargetImage ${TargetOutName}) + + SET(${TAImageName} ${TargetImage}) + ADD_CUSTOM_COMMAND(TARGET ${TargetName} POST_BUILD + COMMAND ${TA_PACKAGE_BUILDER} /usr/bin ${STRIPPED_TARGET_FILE} ${TAManifestFile} + COMMENT "Signing and encrypting image ${${TAImageName}}") +ENDMACRO() diff --git a/helloworld/CMakeLists.txt b/helloworld/CMakeLists.txt index 5e59ea0..3c270c7 100644 --- a/helloworld/CMakeLists.txt +++ b/helloworld/CMakeLists.txt @@ -14,33 +14,52 @@ # # @file # @author Lukasz Kostyra (l.kostyra@samsung.com) -# @brief CMakeLists for tef-simulator CA and TA +# @brief CMakeLists for hello world CA and TA # +############# Entry defines ############# + +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT("tef-simulator-helloworld") + +INCLUDE(FindPkgConfig) + +PKG_CHECK_MODULES(HELLO_WORLD_TA_DEPS REQUIRED + tef-simulator-devkit + ) + +# TODO CMake include provided by devkit to encrypt/sign TA +INCLUDE(TEFSimulatorDevkit) + +SET(TARGET_HELLO_WORLD_CA tef-simulator-helloworld) +SET(TARGET_HELLO_WORLD_TA 00000000-0000-0000-0000-112233445566) + +SET(HELLO_WORLD_PATH ${PROJECT_SOURCE_DIR}) +SET(HELLO_WORLD_TA_PATH ${HELLO_WORLD_PATH}/ta) +SET(HELLO_WORLD_CA_PATH ${HELLO_WORLD_PATH}/host) + ############# TA ############# SET(HELLO_WORLD_TA_SOURCES ${HELLO_WORLD_TA_PATH}/hello_world.c ) -ADD_EXECUTABLE(${TARGET_TEF_SIMULATOR_HELLO_WORLD_TA} +ADD_EXECUTABLE(${TARGET_HELLO_WORLD_TA} ${HELLO_WORLD_TA_SOURCES} ) -ADD_DEPENDENCIES(${TARGET_TEF_SIMULATOR_HELLO_WORLD_TA} - ${TARGET_TEF_SIMULATOR_TEE_STUB} - ) - -INCLUDE_DIRECTORIES( - ${TEF_SIMULATOR_INCLUDE_PATH}/include +# TEEStub is built in C++, so we must force linking using C++ linker +SET_TARGET_PROPERTIES(${TARGET_HELLO_WORLD_TA} PROPERTIES + LINKER_LANGUAGE "CXX" ) -TARGET_LINK_LIBRARIES(${TARGET_TEF_SIMULATOR_HELLO_WORLD_TA} - ${TARGET_TEF_SIMULATOR_TEE_STUB} +# TODO make pkgconfig to hide these deps +TARGET_LINK_LIBRARIES(${TARGET_HELLO_WORLD_TA} + ${HELLO_WORLD_TA_DEPS_LIBRARIES} ) -# TODO directory for TAs -INSTALL(TARGETS ${TARGET_TEF_SIMULATOR_HELLO_WORLD_TA} DESTINATION ${TASTORE_DIR}) +TEF_GENERATE_TA_IMAGE(${TARGET_HELLO_WORLD_TA} ${HELLO_WORLD_TA_PATH}/hello_world.xml HELLO_WORLD_TA_IMAGE) +INSTALL(FILES ${HELLO_WORLD_TA_IMAGE} DESTINATION ${TASTORE_DIR}) ############# CA ############# @@ -49,22 +68,16 @@ SET(HELLO_WORLD_CA_SOURCES ${HELLO_WORLD_CA_PATH}/main.c ) -ADD_EXECUTABLE(${TARGET_TEF_SIMULATOR_HELLO_WORLD_CA} +ADD_EXECUTABLE(${TARGET_HELLO_WORLD_CA} ${HELLO_WORLD_CA_SOURCES} ) -ADD_DEPENDENCIES(${TARGET_TEF_SIMULATOR_HELLO_WORLD_CA} - ${TARGET_TEF_SIMULATOR_TEEC_LIB} - ${TARGET_TEF_SIMULATOR_HELLO_WORLD_TA} - ) - INCLUDE_DIRECTORIES( - ${TEF_SIMULATOR_INCLUDE_PATH}/include ${HELLO_WORLD_TA_PATH} ) -TARGET_LINK_LIBRARIES(${TARGET_TEF_SIMULATOR_HELLO_WORLD_CA} - ${TARGET_TEF_SIMULATOR_TEEC_LIB} +TARGET_LINK_LIBRARIES(${TARGET_HELLO_WORLD_CA} + teec ) -INSTALL(TARGETS ${TARGET_TEF_SIMULATOR_HELLO_WORLD_CA} DESTINATION ${BIN_DIR}) +INSTALL(TARGETS ${TARGET_HELLO_WORLD_CA} DESTINATION ${BIN_DIR}) diff --git a/helloworld/ta/hello_world.c b/helloworld/ta/hello_world.c index 2a6cfe2..188b97d 100644 --- a/helloworld/ta/hello_world.c +++ b/helloworld/ta/hello_world.c @@ -60,7 +60,7 @@ TEE_Result TA_OpenSessionEntryPoint(uint32_t param_types, return TEE_SUCCESS; } -void TA_CloseSessionEntryPoint(const void *sess_ctx) +void TA_CloseSessionEntryPoint(void *sess_ctx) { (void)&sess_ctx; LOG_FUNC(); @@ -84,7 +84,7 @@ static TEE_Result inc_value(uint32_t param_types, return TEE_SUCCESS; } -TEE_Result TA_InvokeCommandEntryPoint(const void *sess_ctx, +TEE_Result TA_InvokeCommandEntryPoint(void *sess_ctx, uint32_t cmd_id, uint32_t param_types, TEE_Param params[4]) diff --git a/include/include/tee_internal_api.h b/include/include/tee_internal_api.h index 71b349d..da84900 100644 --- a/include/include/tee_internal_api.h +++ b/include/include/tee_internal_api.h @@ -242,7 +242,7 @@ TEE_Result TA_EXPORT TA_OpenSessionEntryPoint(uint32_t paramTypes, * @return his function can return no success or error code. * */ -void TA_EXPORT TA_CloseSessionEntryPoint(const void* sessionContext); +void TA_EXPORT TA_CloseSessionEntryPoint(void* sessionContext); /** * Invokes a command within the given sessionContext @@ -270,7 +270,7 @@ void TA_EXPORT TA_CloseSessionEntryPoint(const void* sessionContext); * itself. In any case, the Implementation reports the error code to the client * with the origin @ref TEEC_ORIGIN_TRUSTED_APP. */ -TEE_Result TA_EXPORT TA_InvokeCommandEntryPoint(const void* sessionContext, +TEE_Result TA_EXPORT TA_InvokeCommandEntryPoint(void* sessionContext, uint32_t commandID, uint32_t paramTypes, TEE_Param params[4]); diff --git a/log/CMakeLists.txt b/log/CMakeLists.txt index 7f7c19d..1a67c56 100644 --- a/log/CMakeLists.txt +++ b/log/CMakeLists.txt @@ -23,4 +23,4 @@ SET(LOG_SOURCES ADD_LIBRARY(${TARGET_TEF_SIMULATOR_LOG} ${LOG_SOURCES}) -INSTALL(TARGETS ${TARGET_TEF_SIMULATOR_LOG} LIBRARY DESTINATION ${LIB_INSTALL_DIR}) +INSTALL(TARGETS ${TARGET_TEF_SIMULATOR_LOG} DESTINATION ${LIB_DIR}) diff --git a/osal/CMakeLists.txt b/osal/CMakeLists.txt index 1ff385c..755cd04 100644 --- a/osal/CMakeLists.txt +++ b/osal/CMakeLists.txt @@ -28,4 +28,4 @@ SET(OSAL_SOURCES ADD_LIBRARY(${TARGET_TEF_SIMULATOR_OSAL} ${OSAL_SOURCES}) -INSTALL(TARGETS ${TARGET_TEF_SIMULATOR_OSAL} LIBRARY DESTINATION ${LIB_INSTALL_DIR}) +INSTALL(TARGETS ${TARGET_TEF_SIMULATOR_OSAL} DESTINATION ${LIB_DIR}) diff --git a/packaging/tef-simulator-helloworld.spec b/packaging/tef-simulator-helloworld.spec new file mode 100644 index 0000000..ca72eb3 --- /dev/null +++ b/packaging/tef-simulator-helloworld.spec @@ -0,0 +1,54 @@ +Name: tef-simulator-helloworld +Summary: Hello World application for TEF TrustZone simulator +Version: 0.0.1 +Release: 1 +Group: Security +License: Apache-2.0 and BSD-3-Clause +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake +BuildRequires: boost-devel +BuildRequires: pkgconfig(tef-simulator-devkit) +BuildRequires: tef-simulator-client-devel +Requires: tef-simulator + +%define bin_dir %{?TZ_SYS_BIN:%TZ_SYS_BIN}%{!?TZ_SYS_BIN:%_bindir} +%define lib_dir %{?TZ_SYS_LIB:%TZ_SYS_LIB}%{!?TZ_SYS_LIB:%_libdir} +%define include_dir %{?TZ_SYS_INCLUDE:%TZ_SYS_INCLUDE}%{!?TZ_SYS_INCLUDE:%_includedir} +%define tastore_dir %{lib_dir}/tastore + +%define build_bin_dir %{buildroot}%{bin_dir} +%define build_include_dir %{buildroot}%{include_dir} +%define build_tastore_dir %{buildroot}%{tastore_dir} + +%description +An example Hello World application, for TEF TrustZone simulator +testing purposes. + +%prep +%setup -q + +%build +cd helloworld +cmake . \ + -DCMAKE_BUILD_TYPE=%{?build_type:%build_type}%{!?build_type:RELEASE} \ + -DBIN_DIR=%{build_bin_dir} \ + -DINCLUDE_DIR=%{include_dir} \ + -DTASTORE_DIR=%{build_tastore_dir} +make %{?jobs:-j%jobs} + +%install +cd helloworld +make install + +%pre + +%post +tef-simulator-update-uuid-list.sh 00000000000000000000112233445566 + +%preun + +%postun + +%files -n %{name} +%{bin_dir}/tef-simulator-helloworld +%{tastore_dir}/00000000000000000000112233445566 diff --git a/packaging/tef-simulator.spec b/packaging/tef-simulator.spec index cf33c83..8be0b40 100644 --- a/packaging/tef-simulator.spec +++ b/packaging/tef-simulator.spec @@ -14,29 +14,82 @@ BuildRequires: pkgconfig(cynara-creds-socket) BuildRequires: pkgconfig(libtzplatform-config) BuildRequires: pkgconfig(security-manager) -%global bin_dir %{?TZ_SYS_BIN:%TZ_SYS_BIN}%{!?TZ_SYS_BIN:%_bindir} -%global sbin_dir %{?TZ_SYS_SBIN:%TZ_SYS_SBIN}%{!?TZ_SYS_SBIN:%_sbindir} -%global lib_dir %{?TZ_SYS_LIB:%TZ_SYS_LIB}%{!?TZ_SYS_LIB:%_libdir} -%global tastore_dir %{lib_dir}/tastore +%define bin_dir %{?TZ_SYS_BIN:%TZ_SYS_BIN}%{!?TZ_SYS_BIN:%_bindir} +%define sbin_dir %{?TZ_SYS_SBIN:%TZ_SYS_SBIN}%{!?TZ_SYS_SBIN:%_sbindir} +%define lib_dir %{?TZ_SYS_LIB:%TZ_SYS_LIB}%{!?TZ_SYS_LIB:%_libdir} +%define data_dir %{?TZ_SYS_RO_SHARE:%TZ_SYS_RO_SHARE}%{!?TZ_SYS_RO_SHARE:%_datadir} +%define include_dir %{?TZ_SYS_INCLUDE:%TZ_SYS_INCLUDE}%{!?TZ_SYS_INCLUDE:%_includedir} +%define tastore_dir %{lib_dir}/tastore + +%define build_bin_dir %{buildroot}%{bin_dir} +%define build_sbin_dir %{buildroot}%{sbin_dir} +%define build_lib_dir %{buildroot}%{lib_dir} +%define build_data_dir %{buildroot}%{data_dir} +%define build_include_dir %{buildroot}%{include_dir} +%define build_tastore_dir %{buildroot}%{tastore_dir} %description TEF Simulator provides a TrustZone simulated environment which can be used on platforms not supporting ARM TrustZone environment natively (ex. on an emulator). + +%package -n %{name}-client +Summary: TEF TrustZone simulator client for CA compilation +Group: Security/Libraries +License: Apache-2.0 and BSD-3-Clause +Requires: tef-simulator + +%description -n %{name}-client +TEF Simulator Client contains a libteec library compatible +with TEF Simulator, required to build Client Applications. + + +%package -n %{name}-client-devel +Summary: TEF TrustZone simulator client development package +Group: Security/Libraries +License: Apache-2.0 and BSD-3-Clause + +Requires: tef-simulator-client + +%description -n %{name}-client-devel +TEF Simulator Client Devel contains headers required to build +Client Applications with TEF Simulator Client library. + + +%package -n %{name}-devkit +Summary: TEF TrustZone simulator devkit for TA compilation +Group: Security/Libraries +License: Apache-2.0 and BSD-3-Clause + +Requires: tef-simulator + +%description -n %{name}-devkit +TEF Simulator Devkit provides a static library required to +build Trusted Applications, which are meant to work together +with TEF Simulator. + %prep %setup -q %build -%cmake . \ +# cannot call cmake rpmbuild macro because of scripts removing libTEEStub.a, which is a part of devkit + +cmake . \ -DCMAKE_BUILD_TYPE=%{?build_type:%build_type}%{!?build_type:RELEASE} \ - -DBIN_DIR=%{bin_dir} \ - -DSBIN_DIR=%{sbin_dir} \ - -DTASTORE_DIR=%{tastore_dir} -make %{?silent:--silent} %{?jobs:-j%jobs} + -DBIN_DIR=%{build_bin_dir} \ + -DSBIN_DIR=%{build_sbin_dir} \ + -DLIB_DIR=%{build_lib_dir} \ + -DDATA_DIR=%{build_data_dir} \ + -DINCLUDE_DIR=%{build_include_dir} \ + -DTASTORE_DIR=%{build_tastore_dir} \ + -DPKGCFG_LIB_DIR=%{lib_dir} \ + -DPKGCFG_PREFIX=/usr \ + -DPKGCFG_VERSION=%{version} +make %{?jobs:-j%jobs} %install -%make_install +make install %pre @@ -46,12 +99,23 @@ make %{?silent:--silent} %{?jobs:-j%jobs} %postun -%files -n tef-simulator +%files -n %{name} %{bin_dir}/tef-simulator-daemon -%{bin_dir}/tef-simulator-helloworld -%{_libdir}/libtef-simulator-log.so -%{_libdir}/libtef-simulator-osal.so -%{_libdir}/libtef-simulator-ssflib.so -%{_libdir}/libteec.so -%{tastore_dir}/00000000-0000-0000-0000-112233445566 +%{lib_dir}/libtef-simulator-ssflib.so %{sbin_dir}/tef-simulator-update-uuid-list.sh + +%files -n %{name}-client +%{lib_dir}/libteec.so + +%files -n %{name}-client-devel +%{include_dir}/tee_client_api.h + +%files -n %{name}-devkit +%{bin_dir}/TA_PackageBuilder.sh +%{bin_dir}/TAPackageMaker +%{lib_dir}/libTEEStub.a +%{lib_dir}/libtef-simulator-log.a +%{lib_dir}/libtef-simulator-osal.a +%{include_dir}/tee_internal_api.h +%{lib_dir}/pkgconfig/tef-simulator-devkit.pc +%{data_dir}/cmake/Modules/TEFSimulatorDevkit.cmake diff --git a/pkgconfig/CMakeLists.txt b/pkgconfig/CMakeLists.txt new file mode 100644 index 0000000..73dbc1e --- /dev/null +++ b/pkgconfig/CMakeLists.txt @@ -0,0 +1,26 @@ +# Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# @file CMakeLists.txt +# @author Lukasz Kostyra (l.kostyra@samsung.com) +# @brief +# + +CONFIGURE_FILE(tef-simulator-devkit.pc.in tef-simulator-devkit.pc @ONLY) + +INSTALL(FILES + ${TEF_SIMULATOR_ROOT_PATH}/pkgconfig/tef-simulator-devkit.pc + DESTINATION + ${LIB_DIR}/pkgconfig + ) diff --git a/pkgconfig/tef-simulator-devkit.pc.in b/pkgconfig/tef-simulator-devkit.pc.in new file mode 100644 index 0000000..04ee70a --- /dev/null +++ b/pkgconfig/tef-simulator-devkit.pc.in @@ -0,0 +1,11 @@ +prefix=@PKGCFG_PREFIX@ +exec_prefix=${prefix} +libdir=@PKGCFG_LIB_DIR@ +includedir=${prefix}/include + +Name: tef-simulator-devkit +Description: TEF Simulator TA development kit +Version: @PKGCFG_VERSION@ +Requires: boost dlog openssl +Libs: -L${libdir} -lTEEStub -ltef-simulator-ssflib -ltef-simulator-log -lboost_thread -lboost_system -ldlog +Cflags: -I${includedir}/ diff --git a/ssflib/CMakeLists.txt b/ssflib/CMakeLists.txt index 905ad01..e806c2b 100644 --- a/ssflib/CMakeLists.txt +++ b/ssflib/CMakeLists.txt @@ -104,4 +104,4 @@ TARGET_LINK_LIBRARIES(${TARGET_TEF_SIMULATOR_SSFLIB} ${TARGET_TEF_SIMULATOR_LOG} ) -INSTALL(TARGETS ${TARGET_TEF_SIMULATOR_SSFLIB} LIBRARY DESTINATION ${LIB_INSTALL_DIR}) +INSTALL(TARGETS ${TARGET_TEF_SIMULATOR_SSFLIB} LIBRARY DESTINATION ${LIB_DIR}) -- 2.7.4