跳转至

TrustZone应用

REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 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 安全储存的效能测量