组件框架图
TEE组件化主要包含三个模块,分别为:
- TEE Kernel
- Trusted Application (TA)
- Client Application (CA)
其中, Kernel模块负责TEE OS的客户端的命令解析和参数处理,以及对内部支持的TA的管理,比如查询、安全服务调用等。通过Internal API实现对Trusted Application的接口调用处理, Interface API是内部调用Trusted Application的调用接口,实现TA的具体功能。而Client API提供了如何调用TA的相关安全服务,向用户提供了安全服务的调用接口,其运行在REE环境里。
TA服务调用入口
Service Node
TEE_SRV_DATA_START( ta_createentrypoint, ta_destroyentrypoint, ta_opensessionentrypoint, ta_closesessionentrypoint, ta_invokecommandentrypoint) TEE_SRV_UUID_PROPERTY("gpd.ta.appID", XOR_TA_UUID) TEE_SRV_DATA_END
每一个TA都有自己的UUID,为了方便管理TA,我们将TA作为系统结点串联起来,在使用的时候,根据Client API的输入UUID,在TA链表里查找对应的UUID,从而获取TA的操作句柄。
UUID
UUID格式是标准的数据类型。
#define TA_UUID
{0x5445455f, 0x4944, 0x325f, {0x53, 0x52, 0x56, 0x5f, 0x55, 0x55, 0x19, 0x33 } }
- Entrypoint API
Entrypoint API是利用TA的操作句柄调用其安全服务的入口,由以下五个接口组成:
- ta_createentrypoint
- ta_destroyentrypoint
- ta_opensessionentrypoint
- ta_closesessionentrypoint
- ta_invokecommandentrypoint
CA客户端接口
TA的客户端接口用于调用运行在TEE里的TA服务,主要包括以下五个接口:
- teec_initializecontext
- teec_finalizecontext
- teec_opensession
- teec_closesession
- teec_invokecommand
TA客户端的接口实现和TA服务接口一一对应。
应用客户端接口
设备接口
设备信息获取
int32_t csi_tee_dev_info_get(const uint8_t *name_encrypted, uint32_t name_encrypted_len, const uint8_t *product_key_encrypted, uint32_t product_key_encrypted_len, const uint8_t *name, uint32_t *name_len, const uint8_t *product_key, uint32_t *product_key_len) 参数 name_encrypted- 设备名字加密数据指针 name_encrypted_len- 设备名字加密数据长度 product_key_encrypted- 产品密钥加密数据指针 product_key_encrypted_len- 产品密钥加密数据长度 name- 设备名字指针 name_len- 设备名字长度 product_key - 产品密钥指针 product_key_len - 产品密钥长度 返回值 0 - 成功 !0 - 失败
系统频率
int32_t csi_tee_set_sys_freq(uint32_t clk_src, uint32_t clk_val); 参数 clk_src- 时钟源类型 clk_val- 时钟值 返回值 0 - 成功 !0 - 失败
寄存器
int32_t csi_tee_read_reg(uint32_t addr, uint32_t *val) 参数 addr- 寄存器地址 cval- 寄存器值指针 返回值 0 - 成功 !0 - 失败
int32_t csi_tee_write_reg(uint32_t addr, uint32_t val); 参数 addr- 寄存器地址 val- 设置数据 返回值 0 - 成功 !0 - 失败
获取设备ID
int32_t csi_tee_get_cid(uint8_t *out, uint32_t *out_len) 参数 out- CID输出数据 out_len- CID输出数据长度 返回值 0 - 成功 !0 - 失败
低功耗接口
进入低功耗模式
int32_t csi_tee_enter_lpm(uint32_t gate, uint32_t irqid, tee_lpm_mode_e mode) 参数 gate- PMU gate寄存器地址 irqid- 中断号ID(reserved) mode - 低功耗模式类型 返回值 0 - 成功 !0 - 失败 枚举类型 typedef enum { TEE_LPM_MODE_WAIT = 0, ///< lpm wait TEE_LPM_MODE_DOZE = 1, ///< lpm doze TEE_LPM_MODE_STOP = 2, ///< lpm stop TEE_LPM_MODE_STANDBY = 3, ///< lpm standby TEE_LPM_MODE_CLOCK = 4, ///< lpm clock gate TEE_LPM_MODE_MAX, } tee_lpm_mode_e;
字符编码接口
Base64编解码接口
int32_t csi_tee_base64(const uint8_t *in, uint32_t in_len, uint8_t *out, uint32_t *out_len, uint32_t is_encode, uint32_t wsafe); 参数 in - 消息数据指针 in_len - 消息数据长度 out - 编码数据存放指针 out_len- 编码数据长度 is_encode - 编码解码标志位 wsafe - websafe取代特性 返回值 0 - 成功 !0 - 失败
Base64编码接口
int32_t csi_tee_base64_encode(const uint8_t *in, uint32_t in_len, uint8_t *out, uint32_t *out_len) 参数 in - 消息数据指针 in_len - 消息数据长度 out - 编码数据存放指针 out_len- 编码数据长度 返回值 0 - 成功 !0 - 失败
Base64解码接口
int32_t csi_tee_base64_decode(const uint8_t *in, uint32_t in_len, uint8_t *out, uint32_t *out_len) 参数 in - 消息数据指针 in_len - 消息数据长度 out - 解码数据存放指针 out_len- 解码数据长度 返回值 0 - 成功 !0 - 失败
消息认证码接口
HMAC
int32_t csi_tee_hmac(const uint8_t *in, uint32_t in_len, const uint8_t *key, uint32_t key_len, uint8_t *out, tee_hmac_type_e type, tee_hash_op_e hash_op, uint32_t *ctx); 参数 in - 消息数据指针 in_len - 消息数据长度 key - 密钥指针 key_len - 密钥长度 out - 认证码存放指针 type- 认证码类型 hash_op- 哈希类型 ctx - 哈希上下文 返回值 0 - 成功 !0 - 失败 枚举类型 typedef enum { TEE_SHA1 = 0, ///< SHA1 TEE_SHA256 = 1, ///< SHA256 TEE_SHA224 = 2, ///< SHA224 TEE_SHA384 = 3, ///< SHA384 TEE_SHA512 = 4, ///< SHA512 TEE_SHA_MAX, ///< invaild sha type } tee_sha_type_t; /****** TEE HMAC type *****/ typedef enum { TEE_HMAC_SHA1 = 1, ///< HMAC with SHA1 } tee_hmac_type_e;
int32_t csi_tee_hmac_digest(const uint8_t *in, uint32_t in_len, const uint8_t *key, uint32_t key_len, uint8_t *out, tee_hmac_type_e type) 参数 in - 消息数据指针 in_len - 消息数据长度 key - 密钥指针 key_len - 密钥长度 out - 认证码存放指针 type- 认证码类型 返回值 0 - 成功 !0 - 失败
随机数接口
随机数生成种子
int32_t csi_tee_rand_generate(uint8_t *out, uint32_t out_len); 参数 out - 随机数存放指针 out_len- 随机数长度 返回值 0 - 成功 !0 - 失败
随机数生成
int32_t csi_tee_rand_generate(uint8_t *out, uint32_t out_len); 参数 out - 随机数存放指针 out_len- 随机数长度 返回值 0 - 成功 !0 - 失败
哈希接口
哈希基本操作
int32_t csi_tee_sha(const uint8_t *in, uint32_t in_len, uint8_t *out, tee_sha_type_t type, tee_hash_op_e hash_op, void *ctx) 参数 in - 哈希数据指针 in_len - 哈希数据长度 out - 哈希密钥指针 type - 哈希类型 hash_op- 哈希操作类型 ctx - 哈希上下文 返回值 0 - 成功 !0 - 失败 枚举定义 typedef enum { TEE_SHA1 = 0, ///< SHA1 TEE_SHA256 = 1, ///< SHA256 TEE_SHA224 = 2, ///< SHA224 TEE_SHA384 = 3, ///< SHA384 TEE_SHA512 = 4, ///< SHA512 TEE_SHA_MAX, ///< invaild sha type } tee_sha_type_t; typedef enum { TEE_HASH_OP_NONE = 0, ///< No operation TEE_HASH_OP_START = 1, ///< HASH init TEE_HASH_OP_UPDATA = 2, ///< HASH update TEE_HASH_OP_FINISH = 3, ///< HASH finish TEE_HASH_OP_MAX, ///< invailed operation } tee_hash_op_e;
消息哈希
int32_t csi_tee_sha_digest(tee_sha_type_t type, void *ctx); 参数 hash_op- 哈希操作类型
消息哈希Start接口
int32_t csi_tee_sha_start(tee_sha_type_t type, void *ctx); 参数 in - 哈希数据指针 in_len - 哈希数据长度 out - 哈希密钥指针 type - 哈希类型 返回值 0 - 成功 !0 - 失败
消息哈希update接口
int32_t csi_tee_sha_update(const uint8_t *in, uint32_t in_len, uint8_t *ctx); 参数 in - 哈希数据指针 in_len - 哈希数据长度 ctx - 哈希上下文 返回值 0 - 成功 !0 - 失败
消息哈希finish接口
int32_t csi_tee_sha_finish(uint8_t *out, void *ctx); 参数 out - 哈希密钥指针 ctx - 哈希上下文 返回值 0 - 成功 !0 - 失败
AES接口
AES加密
int32_t csi_tee_aes_encrypt(const uint8_t *in, uint32_t in_len, const uint8_t *key, uint32_t key_len, uint8_t iv[16], uint8_t *out, tee_aes_mode_e mode) 参数 in - 加密数据指针 in_len - 加密数据长度 key - 加密密钥指针 key_len - 加密密钥长度 iv - IV指针 out - 加密数据指针 mode - AES操作模式 返回值 0 - 成功 !0 - 失败 枚举定义 typedef enum { TEE_AES_MODE_ECB = 0, ///< TEE AES ECB mode TEE_AES_MODE_CBC = 1, ///< TEE AES CBC mode TEE_AES_MODE_MAX, ///< invaild mode } tee_aes_mode_e;
AES 解密
int32_t csi_tee_aes_decrypt(const uint8_t *in, uint32_t in_len, const uint8_t *key, uint32_t key_len, uint8_t iv[16], uint8_t *out, tee_aes_mode_e mode) 参数 in - 解密数据指针 in_len - 解密数据长度 key - 解密密钥指针 key_len - 解密密钥长度 iv - IV指针out - 解密数据指针 out - 解密数据指针 mode - AES操作模式 返回值 0 - 成功 !0 - 失败 枚举定义 typedef enum { TEE_AES_MODE_ECB = 0, ///< TEE AES ECB mode TEE_AES_MODE_CBC = 1, ///< TEE AES CBC mode TEE_AES_MODE_MAX, ///< invaild mode } tee_aes_mode_e;
AES-ECB 加密
int32_t csi_tee_aes_encrypt_ecb(const uint8_t *in, uint32_t in_len, const uint8_t *key, uint32_t key_len, uint8_t *out) 参数 in - 加密数据指针 in_len - 加密数据长度 key - 加密密钥指针 key_len - 加密密钥长度
AES-ECB 解密
int32_t csi_tee_aes_decrypt_ecb(const uint8_t *in, uint32_t in_len, const uint8_t *key, uint32_t key_len, uint8_t *out) 参数 in - 解密数据指针 in_len - 解密数据长度 key - 解密密钥指针 key_len - 解密密钥长度 out - 解密数据指针 返回值 0 - 成功 !0 - 失败
AES-CBC 加密
int32_t csi_tee_aes_encrypt_cbc(const uint8_t *in, uint32_t in_len, const uint8_t *key, uint32_t key_len, uint8_t *iv, uint8_t *out) 参数 in - 加密数据指针 in_len - 加密数据长度 key - 加密密钥指针 key_len - 加密密钥长度 iv - iv数据指针 out - 加密数据指针 返回值 0 - 成功 !0 - 失败
AES-CBC 解密
int32_t csi_tee_aes_decrypt_cbc(const uint8_t *in, uint32_t in_len, const uint8_t *key, uint32_t key_len, uint8_t *iv, uint8_t *out) 参数 in - 解密数据指针 in_len - 解密数据长度 key - 解密密钥指针 key_len - 解密密钥长度 iv - iv数据指针 out - 解密数据指针 返回值 0 - 成功 !0 - 失败
RSA接口
签名
int32_t csi_tee_rsa_sign(const uint8_t *in, uint32_t in_len, const uint8_t *key, uint32_t key_len, uint8_t *sign, uint32_t *sign_len, tee_rsa_sign_type_e type); 参数 in - 消息指针 in_len - 消息长度 key - 私钥指针 key_len - 私钥长度 sign - 签名数据指针 sign_len - 签名数据长度 type - 签名类型 返回值 0 - 成功 !0 - 失败 枚举类型 typedef enum { TEE_RSA_MD5 = 0, ///< MD5 TEE_RSA_SHA1 = 1, ///< SHA1 TEE_RSA_SHA256 = 3, ///< SHA256 TEE_RSA_SIGN_TYPE_MAX, ///< invailed type } tee_rsa_sign_type_e;
认证
int32_t csi_tee_rsa_verify(const uint8_t *in, uint32_t in_len, const uint8_t *key, uint32_t key_len, uint8_t *sign, uint32_t sign_len, tee_rsa_sign_type_e type); 参数 in - 消息指针 in_len - 消息长度 key - 公钥指针 key_len - 公钥长度 sign - 签名数据指针 sign_len - 签名数据长度 type - 签名类型 返回值 0 - 成功 !0 - 失败 枚举类型 typedef enum { TEE_RSA_MD5 = 0, ///< MD5 TEE_RSA_SHA1 = 1, ///< SHA1 TEE_RSA_SHA256 = 3, ///< SHA256 TEE_RSA_SIGN_TYPE_MAX, ///< invailed type } tee_rsa_sign_type_e;
加密
int32_t csi_tee_rsa_encrypt(const uint8_t *in, uint32_t in_len, const uint8_t *key, uint32_t key_len, uint8_t *out, uint32_t *out_len, tee_rsa_padding_mode_e padding); 参数 in - 消息指针 in_len - 消息长度 key - 公钥指针 key_len - 公钥长度 out- 加密数据指针 out_len - 加密数据长度 padding- 加密类型 返回值 0 - 成功 !0 - 失败 枚举类型 typedef enum { TEE_RSA_PKCS1_PADDING = 0x01, ///< RSA PKCS padding mode TEE_RSA_NO_PADDING = 0x02, ///< RSA no padding mode } tee_rsa_padding_mode_e;
解密
int32_t csi_tee_rsa_decrypt(const uint8_t *in, uint32_t in_len, const uint8_t *key, uint32_t key_len, uint8_t *out, uint32_t *out_len, tee_rsa_padding_mode_e padding); 参数 in - 消息指针 in_len - 消息长度 key - 私钥指针 key_len - 私钥长度 out- 加密数据指针 out_len - 加密数据长度 padding- 加密类型 返回值 0 - 成功 !0 - 失败 枚举类型 typedef enum { TEE_RSA_PKCS1_PADDING = 0x01, ///< RSA PKCS padding mode TEE_RSA_NO_PADDING = 0x02, ///< RSA no padding mode } tee_rsa_padding_mode_e;