TrustZone应用¶
REVISION HISTORY¶
| Revision No. | Description |
Date |
|---|---|---|
| 1.0 | 05/22/2023 |
1. TRUSTZONE 的使用¶
1.1. TA镜像的签名¶
生成原始的TA镜像文件之后将会对该文件进行签名生成最终的xxx.ta文件,该文件会被保存在REE的文件系统中。对原始TA镜像文件和签名是通过调用optee_os/scripts/sign_encrypt.py,使用optee_os/keys/目录下的RSA2048私钥来完成的。开发者需要使用自己生成的私钥对ta进行签名,将对应的公钥替换optee_os/keys/目录下用于运行过程的验签,optee_os需要重新编译。
-
openssl genrsa -out /path/to/private_key.pem 2048 -
openssl rsa -in /path/to/private_key.pem -pubout -out /path/to/public_key.pem -
vim optee_os/mk/config.mk 修改 -
TA_SIGN_KEY 为指定的/path/to/private_key.pem路径名和文件名 -
TA_PUBLIC_KEY 为指定的/path/to/public_key.pem路径名和文件名 -
sign_encrypt.py digest --key /path/to/private_key.pem --uuid $(user-ta-uuid) --in $(user-ta-uuid).stripped.elf (产生$(user-ta-uuid).dig) -
base64 --decode $(user-ta-uuid).dig | openssl pkeyutl -sign -inkey /path/to/private_key.pem -pkeyopt digest:sha256 -pkeyopt rsa_padding_mode:pss -pkeyopt rsa_pss_saltlen:digest -pkeyopt rsa_mgf1_md:sha256 | base64 > $(user-ta-uuid).sig (产生$(user-ta-uuid).sig) -
sign_encrypt.py stitch --key /path/to/public_key.pem --uuid $(user-ta-uuid) --in $(user-ta-uuid).stripped.elf (产生$(user-ta-uuid).ta)
1.2. TA镜像的加密¶
TA在编译阶段可以对内容加密。而载入TA时,若发现是加密过的TA,则会做解密的动作。
1.2.1 TA加密的选项¶
-
在TA的Makefile中,加上CFG_ENCRYPT_TA=y。以Hello world example为例,即在optee_examples/hello_world/ta/Makefile中加一行CFG_ENCRYPT_TA=y。如此编译出来的TA内容即会被加密过。
-
在OPTEE的Makefile中并不需要加上CFG_ENCRYPT_TA=y选项。
1.2.2 Key的指定¶
- TA_ENC_KEY:编译TA过程中,用来加密TA的key。在optee_os/ta/arch/arm/link.mk中指定,在系统中会以tee_otp_get_ta_enc_key() 的行为产生这把key,而默认的tee_otp_get_ta_enc_key() 行为是以HUK来产生TA_ENC_KEY。图1中的TA_ENC_KEY即是以默认的HUK所产生的。请注意,这部分原生代码仅做为演示功能,请替换自己的key。

图1 TA key的指定
1.3 安全储存¶
1.3.1 安全储存介绍¶
安全储存是TEE用来储存资料的方式,只能由TA存取。储存的内容包括:
- 密钥
- 一般数据
OPTEE包含两种安全储存:
- REE-FS
- 以REE档案系统為储存
- CFG_REE_FS=y
- Replay Protected Memory Block(RPMB)
- eMMC中一个具有安全属性的分区
- CFG_RPMB_FS=y
SGS chip上默认支援REE-FS,这里皆以REE-FS做介绍。
1.3.2 档案操作流程¶
- TA呼叫GP安全储存API去寫入一個persistent object
- 呼叫TEE安全储存服務中的系统呼叫
- 接著呼叫TEE档案操作,将数据加密,並送REE的档案操作及加密過的数据給TEE supplicant
- TEE supplicant收到后将加密过后的数据储存在REE档案系统中
1.3.3 安全储存密钥管理¶
OP-TEE在开机时会先产生一把SSK放在安全內存中,产生的流程如下图:

图2 开机时产生SSK流程
安全储存会用到三种密钥

图3 安全储存的三种密钥
- Secure storage key(SSK)
- 每个装置上OP-TEE安全储存唯一的一把密钥
- 在开机时产生,并且储存在安全內存中
- SSK由hardware unique key(HUK)及Chip ID/SSK String做HMAC-SHA256所产生
- SSK String是为了用做避免装置上其他系统同时产生出相同的SSK
- TA storage key(TSK)
- 每个装置上TA唯一的一把密钥
- 由SSK及TA UUID做HMAC-SHA256所产生
- File encryption key(FEK)
- 每个档案唯一的一把密钥
- 用来对档案加解密
- 以PRNG产生,以TSK加密后储存在meta file中
1.3.4 安全储存的移植¶
- SGS OTP上HUK及Chip ID的储存方式
- 有OTP_Key1~OTP_Key8共八把密钥(128-bits)。可取任意一把来做为HUK的储存栏位
- 有UUID及UUID2共两个栏位 (64-bits)。可取任一栏位来做为Chip ID的储存栏位
- OP-TEE中与密钥管理有关的编译选项
- CFG_CORE_HUK_SUBKEY_COMPAT(预设值为y)。设定SSK的产生是否相容于HUK与Chip ID及SSK String的方式
- CFG_CORE_HUK_SUBKEY_COMPAT_USE_OTP_DIE_ID(预设值为n)。设定Chip ID是否可由OTP die ID的方式取得
- 密钥管理中可以客制化的API
- tee_otp_get_hw_unique_key():平台取得HUK的方式。一定要实现
- tee_otp_get_die_id():平台取得Chip ID的方式
1.3.5 安全储存的效能测量¶
OPTEE xtest有提供安全储存的效能测量的测项
- ./xtest –t benchmark 1001(测试写入)
- ./xtest –t benchmark 1002(测试读取)
- ./xtest –t benchmark 1003(测试再写入)

图4 安全储存的效能测量