TA链接的组件

位于trustzone_images/core/bsp/trustzone/qsapps/applib64/ (64bit)

Untitled

其中两个.o文件被静态链接到每个TA里面,而.lib编译到cmnlib/cmnlib64里

Untitled

tzapp_entry.so

被静态链接到每个TA里面

Untitled

Untitled

其中TZAPPENTRYCODE是一个特殊的section,其中包含入口点一个定义的符号TZAPPENTRY

根据编译选项-e TZAPPENTRYTZAPPENTRY是程序入口点。

TZAPPENTRY

是一个薄层:

Untitled

调用get_app_md(): applib64.lib/common_applib.o: 指定了CElfFile_invoke作为entry_addr

Untitled

app_export_init_info_to_qsee(): applib64.lib/tzapp_syscall.o: 将app metadata通过系统调用传给qsee

Untitled

get_cmnlib_ctx_ptr

get_cmnlib_ctx_ptr(): 从系统寄存器[TPIDRRO_EL0](https://developer.arm.com/documentation/ddi0595/2021-03/AArch64-Registers/TPIDRRO-EL0--EL0-Read-Only-Software-Thread-ID-Register)中读得cmnlib_ctx的地址

Untitled

tzapp_lib_main.o

Untitled

applib32.lib / applib64.lib

是静态库文件,包含121个.o文件,

重要的部分:

metadata.c

在编译前生成metadata.c,包含TA的元数据,参与链接。

脚本位置:trustzone_images/core/bsp/build/scripts/secure_apps.py

metadata.c大致内容

const char __attribute__((section(".rodata.sentinel"))) TA_METADATA[] = %s;
const char* TA_APP_NAME = "%s";
const unsigned char TA_UUID[] = { 0x%s, 0x%s, 0x%s, 0x%s,
                                  0x%s, 0x%s, 0x%s, 0x%s,
                                  0x%s, 0x%s, 0x%s, 0x%s,
                                  0x%s, 0x%s, 0x%s, 0x%s };
const unsigned int TA_ACCEPT_BUF_SIZE = %s;
char ta_acceptBuf[%s] = {0};
const bool ta_multiSession = %s;
const char * ta_version = "%s";
const char * ta_description = "%s";
const struct TACustomProperty {
   char const * name;
   char const * value;
} ta_customProperties[] = {}
const unsigned int TA_CUSTOM_PROPERTIES_NUM = %s;

TZAPP生命周期

API

大致有以下几类

soter64

https://github.com/Tencent/soter/wiki/原理: TENCENT SOTER中,一共有三个级别的密钥:ATTK,App Secure Key(ASK)以及AuthKey。这些密钥都是RSA-2048的非对称密钥。

一些额外的知识

arm64 sysregs

使用msrmrs指令读写系统寄存器,具体寄存器的编号用S<op0><op1>_C<CRn>_C<CRm0><op2>格式表示。在ARM32中是使用协处理器和mrcmcr来处理的。